【问题标题】:AI logic to rotate towards a gameobject向游戏对象旋转的 AI 逻辑
【发布时间】:2016-03-04 09:33:49
【问题描述】:

我正在尝试构建一个游戏,其中 AI 需要不断远离玩家并不断收集地图上随机生成的收藏品。如何让它朝向新生成的收藏对象旋转?

玩家和对手都需要特殊移动,如下代码所示..

if (touch.position.x < Screen.width / 2 && touch.position.y < Screen.height / 2) {
            Player.Rotate (0, 0, 5);
}
if (touch.position.x > Screen.width / 2 && touch.position.y < Screen.height / 2) {
            Player.Rotate (0, 0, 5);
}

对手也根据旋转角度不断向前移动,因此只需将对手旋转到正确的方向

void Update(){
transform.position += transform.up * Time.deltaTime * EnemySpeed;
}

这是我让对手 AI 找到收藏品的位置并朝它旋转的代码

void AIControls ()
{
    if (GameManager.Instance.CollectibleReady) {
        //rotate towards collectible Item
    Vector3 opponentPos = transform.position;
    foodPos.x = foodPos.x - opponentPos.x;
    foodPos.y = foodPos.y - opponentPos.y;

    angle = Mathf.Atan2 (foodPos.y, foodPos.x) * Mathf.Rad2Deg;
    transform.rotation = Quaternion.Euler (new Vector3 (0, 0, angle));

    } else {
      //Wander aimlessly avoid the player   
    }
}

这不能正常工作,对手不会向新生成的收藏品旋转。请帮忙!

【问题讨论】:

  • 你不应该反转targetDir吗?那个向量是从 AI 到玩家的,我猜你想要相反的东西,或者从那个向量旋转 90 度。
  • 哦,是的,谢谢,这是有道理的,但我不确定如何从矢量旋转 90 度。另外,想知道如何将我的对手旋转到 vector3 点
  • (x, y) 旋转 90 度就是 (-y, x),如果你想逆时针旋转它就是 (y, -x)。但是,如果您想以任意角度旋转矢量。 ` theta = deg2rad(角度); cs = cos(θ); sn = sin(θ);点X = x * cs - y * sn; pointY = x * sn + y * cs;`
  • 希望我能注意学校教的所有数学。所以我尝试应用一些三角函数并修改了我的问题

标签: unity3d artificial-intelligence


【解决方案1】:

我认为Quaternion.LookRotation可以帮助你-http://docs.unity3d.com/ScriptReference/Quaternion.LookRotation.html

所以你可以这样写:

var directionToFood = foodPos - transform.position;
transform.rotation = Quaternion.LookRotation(directionToFood, Vector3.up);

【讨论】:

  • 这使它在所有轴上旋转。如何阻止它在所有轴上旋转。因为它是一个 2d 游戏,我希望它只在 Z 轴上旋转。
  • 可以,但是收藏品和对手不是在一个平面上吗?如果是这样,只要它们不在 Y 轴上上下移动,就永远不会在 Y 轴上旋转(假设您的游戏基于 X-Z 平面)。如果您确实需要将其固定在飞机上,您可以修改 directionToFood 例如directionToFood = new Vector3(directionToFood.x,0,directionToFood.z);
  • 所以我还是不明白lookRotation的概念。我正在制作一个 2D 游戏。对手和食物在 Z 轴的 0 位置。我想将食物的 x 和 y 位置提供给对手,让它在 Z 轴上旋转,只是为了让它指向食物。你能帮忙吗!
【解决方案2】:

好的,在玩了一段时间后,我得到了我想要的,在这里添加代码以供可能觉得有用的人使用。

void AIControls ()
{
    if (GameManager.Instance.CollectibleReady) {
    //rotate towards collectible Item
    Vector3 opponentPos = Camera.main.WorldToScreenPoint (this.transform.position);
    Vector3 foodtPos = Camera.main.WorldToScreenPoint (food.transform.position);
    Vector3 relativePos = foodPos - opponentPos;
    float angle = Mathf.Atan2 (relativePos.y, relativePos.x) * Mathf.Rad2Deg;
    this.transform.rotation = Quaternion.Euler (new Vector3 (0, 0, angle - 90));
    }
}

感谢大家调查此事!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2018-06-14
    相关资源
    最近更新 更多