如何让敌人AI跟随玩家而不旋转或盯着玩家看
本文关键字:玩家 旋转 敌人 AI 跟随 | 更新日期: 2023-09-27 18:16:20
我是一名编程新手,我正在为我的项目制作一款2D横向卷轴游戏。我有一个AI为我的敌人工作,但我的敌人物体被建模为平面,所以只显示一面。当我开始游戏时,当我希望敌人保持现状但仍朝玩家移动时,敌人会立即转向面对玩家。
https://i.stack.imgur.com/qcL39.png这是我希望敌人保持的样子,只是在它向玩家滑动时显示这张脸,而不旋转或倾斜。
https://i.stack.imgur.com/P6xOH.png这就是当我开始游戏时发生的事情,这就是为什么我不希望对象旋转或倾斜。如果你想了解我所做的更多信息,或者如果我不清楚,请告诉我。这是我第一次在网上提问。
这是我得到的敌人ai的代码。我知道当涉及到我想要实现的东西时,代码都是错误的,但我的编码知识非常有限,仍在学习。
//------------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;
}
}
你的问题是你对"forward"的意思有些困惑。你需要决定前进的方向。目前,"前进"是"出屏幕",因为你在做2D横向滚动游戏,你的所有敌人都面朝屏幕外。
然而,你试图使用LookAt()
让角色看着玩家。但是他们当然会转身,因为每个敌人网格/模型的"向前"是当前从他们的脸面向外的方向。
你有两个选择。一种是把所有的模型旋转90度,这样向前的部分就会从它们的侧面出来。在这种情况下,你仍然可以使用LookAt(),然后告诉敌人向前移动,但从视觉上看,他们仍然会向屏幕外看。然而,如果你走到敌人的另一边,他们就会转身回去。所以可能不是一个好的选择。
另一个选择是,你不应该使用"前进"向量来设置敌人的变换/位置。只需根据敌人位置和玩家位置之间的差异向量来设置敌人位置。从玩家位置向量中减去敌人位置向量,你就会得到一个指向玩家方向的向量。将其归一化以得到单位方向向量。然后将其乘以移动速度和增量时间。用它来代替"前进",你的敌人就会朝玩家靠近。在这种情况下,你根本不调用LookAt()
,因为你总是希望敌人面向屏幕外。
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;
}