今天也要直播魔法,求科学的!
欢迎来到小妖精Balous的完美游戏教室!
在上节课,小妖精介绍了怪物路径的实现办法,相信米娜桑已经成功了呢。既然我们已经设计好路径,接下来肯定是要让怪物在路径中移动起来,对吧?所以这节课主要介绍如何让怪物在路径中移动。小妖精相信感兴趣的同学在上周已经在网上查阅过相关的资料,你会发现大家的实现方式都大同小异,这是肯定的嘛,毕竟一些落后的方法已经被淘汰掉了。所以,小妖精教给大家的,都是目前最通用的实现方法啦,希望能帮助到大家。
好啦,言归正传,如果实现怪物的移动。
其实移动,说白了就是改变怪物的世界坐标,世界坐标改变了,在玩家看上去就是移动啦。所以呢,要实现移动,就是要算出下一帧,怪物的新坐标。在上节课,我们已经实现了路径,而路径是个链表,也就是说,只要怪物保留了路径链表的头结点,就能够沿着路径走到终点啦,是不是很简单呢。
既然如此,怪物除了坐标系统外,应该还有下面这些额外的属性:
/// <summary>
/// 怪物移动速度
/// </summary>
public float moveSpeed;
/// <summary>
/// 怪物起始结点
/// </summary>
public PathNode startNode;
拥有这些属性后,加上坐标系统,怪物就能够移动咯^o^,下面我用目前市场占比最高的游戏引擎unity为例子,示范最简单的移动代码该怎么写。
/// <summary>
/// 怪物移动方法
/// </summary>
private void Move()
{
Vector3 currentPos = transform.position;
//起始结点在运行时用作目标结点
Vector3 goalPos = startNode.transform.position;
//如果到达目标结点,更新下一个目标结点
if(Vector2.Distance(new Vector2(goalPos.x,goalPos.y),new Vector2(currentPos.x,currentPos.y)) < 0.01f)
{
//如果到达终点
if(startNode.nextNode == null)
{
Destroy(gameObject);
}
startNode = startNode.nextNode;
}
//计算移动方向
Vector3 dir = new Vector3(goalPos.x - currentPos.x, goalPos.y - currentPos.y).normalized;
transform.Translate(dir * moveSpeed * Time.deltaTime);
}
好啦,这节课就到这里,小妖精会在下节课跟大家见面,byebye~~