0

ここに画像があります(投稿できません)XNAゲームで何をしようとしているのかを示しています。プレーヤーがゾーン範囲内にあるかどうかを確認し、そうであればプレーヤーを攻撃します。チェックレイを使用してこれを実行しようとしましたが、プレイヤーは敵の前にいる必要があるため、奇妙で無効な結果が得られます。![ここに画像の説明を入力][1]

if (enemyRay.Intersects(cci.CharacterController.Body.CollisionInformation.BoundingBox) <= 200)
        {
            RunController(dwarfAnimatior, dwarfwalk);
            dwarfChrachterController.Body.ApplyImpulse(dwarfChrachterController.Body.OrientationMatrix.Forward,
              Vector3.Normalize(enemyRay.Direction) * 50.0f);
            if (enemyRay.Intersects(cci.CharacterController.Body.CollisionInformation.BoundingBox) <= 50)
            {
                sound.playAh();
            }
        }
4

1 に答える 1

0

次の 2 つのことを行う必要があります。

  1. プレイヤーの位置と敵の位置の間の距離を確認します。

  2. プレイヤーと敵の間の線と、プレイヤーの視点の方向を指す線がなす角度が 180 度未満であることを確認します。

最初は簡単です:

bool isCloseEnoughToAttack = Vector.Magnitude( Math.abs(player.position - enemy.position) ) < distanceToStartAttacking

2 つ目はもう少し複雑です。「プレーヤーの前」が何を意味するかについて特にこだわる必要がない限り、Dot Product が 0 より大きいことを確認することで、角度が後ろでないことをかなり簡単に確認できます。

bool isInFrontOfPlayer = Vector.DotProduct(Vector.Normalize(player.position - enemy.position), player.lookAtDirection) > 0 

注 - このコードは疑似コードです。変数/ライブラリの正確な名前はわかりません。しかし、それはかなり似ているはずです。

于 2013-10-23T11:03:56.823 に答える