【问题标题】:How to make an enemy AI that would follow the player without rotating or looking at the player?如何让敌人 AI 跟随玩家而不旋转或看着玩家?
【发布时间】:2013-05-31 22:44:23
【问题描述】:

我是编程新手,我正在为我的项目制作 2D 横向滚动节拍器。我让一个 AI 为我的敌人工作,但我的敌人对象被建模为扁平的,因此只显示一侧。当我开始游戏时,当我希望敌人保持原样但仍朝玩家移动时,敌人会立即旋转以面向玩家。

http://i.imgur.com/TJYtfro.png这就是我希望敌人保持的样子,只是显示这张脸,因为它滑向玩家而不旋转或倾斜。

http://i.imgur.com/n0gI2Rf.png 这就是我开始游戏时发生的情况,这就是为什么我不希望对象旋转或倾斜。如果您想了解我所做的更多信息或者我不清楚,请告诉我。这是我第一次在网上问。

这是我得到的enemyAI的代码。我知道就我想要实现的目标而言,代码都是错误的,但我的编码知识非常有限,仍在学习。

//------------Variables----------------//
public Transform target;
public int moveSpeed;
public int rotationSpeed;
public int maxdistance;
private Transform myTransform;
//------------------------------------//    

void Awake()
{
    myTransform = transform;
}


void Start ()
{

    maxdistance = 2;
}


void Update ()
{


    if(Vector3.Distance(target.position, myTransform.position) > maxdistance)
    {
    //Move towards target
    transform.LookAt (target.position);     
    myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;

    }
}   

【问题讨论】:

  • 如果您注释掉 transform.LookAt() 或将其设置为 transform.LookAt(new Vector(0,0,1)) 以使其沿 Z 轴看会发生什么?看看这个:docs.unity3d.com/Documentation/ScriptReference/…
  • 当我注释掉它时,没有一个敌人移动。当我将其设置为 transform.LookAt(new Vector3(0,0,1)) 时,所有人都开始向上看,完全忽略了玩家。

标签: c# unity3d


【解决方案1】:

您的问题是您对“前进”的含义有些困惑。你需要决定前进的方向是什么。目前,“前进”是“屏幕外”,因为您正在执行 2D 横向滚动,并且您的所有敌人都面向屏幕外。

但是,您尝试使用LookAt() 让角色看着玩家。但是他们当然会转身,因为每个敌方网格/模型的“前进”当前是他们脸朝外的方向。

你有两个选择。一种是将所有模型旋转 90 度,以便向前从他们的一侧出来。在这种情况下,您仍然可以使用 LookAt() 然后告诉敌人向前移动,但从视觉上看,他们仍然会看着屏幕外。但是,如果你走到他们的另一边,敌人会​​向后转身。所以可能不是一个好的选择。

另一个选项是你不应该使用“前向”向量来设置敌人的变换/位置。只需根据敌人位置和玩家位置之间的差异向量来设置敌人位置。从玩家位置向量中减去敌人位置向量,您将得到一个指向玩家方向的向量。对其进行归一化以获得单位方向向量。然后将其乘以上面的移动速度和增量时间。使用它而不是“前进”,你的敌人会朝着玩家。在这种情况下,您根本不需要调用LookAt(),因为您总是希望敌人面朝屏幕外。

编辑:我没有 Unity 的副本,但它应该是这样的:

if (Vector3.Distance(target.position, myTransform.position) > maxdistance)
{
  // Get a direction vector from us to the target
  Vector3 dir = target.position - myTransform.position;

  // Normalize it so that it's a unit direction vector
  dir.Normalize();

  // Move ourselves in that direction
  myTransform.position += dir * moveSpeed * Time.deltaTime;
}

【讨论】:

  • 我在脚本方面的知识非常有限,尽管我理解您的建议。就是不知道怎么写成编码的形式。
  • @LaCookieFreak 我已经添加了一些接近 Unity 中的内容,但我不能保证它会完全按原样编译——您可能需要稍微调整一下。但它应该很接近。
  • 非常感谢!有效!你不知道你的帮助对我有多大意义^^谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
相关资源
最近更新 更多