博客中的素材源自SIKI学院的哔哩哔哩视频,在这里向大家推荐SIKI学院!视频地址:https://www.bilibili.com/video/BV15W411976h
因为笔者也是初学阶段,可能会犯下基本的错误,这里欢迎各位批评指正,由于笔者想要重点分享脚本部分,其他基础操作部分会尽量简略,希望能得到谅解。
一、起步
我们需要准备官网的Unity以及Visual Studio两样工具来进行开发。
打开UnityHub,从中创建一个Unity3D项目,我们可以看到崭新而空旷的界面。此时,在SampleScene下创建一个“Plane”游戏物体对象,这样一来,我们的游戏就拥有了自己的地板。
在地板上创建扁平的方块(Cube),并通过多次复制方块形成之后能放置炮塔的地面,此后,我们需要制作一条地板。
此时,基本工作就告一段落了,现在我们创建一个空物体wayPoint,然后我们在弯道处,也就是在wayPoint内放置更多空的物体,来让敌人在未来能做到顺着路径转向,这些空的对象务必放在敌人能够得到的高度上(贴近地面)。
二、得到那些弯道处的物体对象
现在我们在工程里新建Script文件夹,创建名为WayPoint的C#脚本文件,并将它挂载到空物体wayPoint上。
删除默认的Start和Update方法,我们来输入如下代码:
//创建Transform数组对象positions,并在Awake生命周期函数中使用它
public static Transform[] positions;
private void Awake()
{
//对positions对象进行实例化,为其申请与wayPointd下子物体的数
//量相当的空间
positions = new Transform[transform.childCount];
//for循环将挂载对象里的gameObject传入positions
for(int i = 0; i < positions.Length; i++)
{
positions[i] = transform.GetChild(i);
}
}
这行代码是为了获取所有弯道物体而写下的。代码中的transform.childCount指向挂载该脚本物体的子物体,笔者认为Unity的一大灵活之处是不需要单独获取游戏对象,脚本继承MonoBehaviour接口之后便可以直接进行一些操作。
接下来我们需要创建四个小球(名称为enemy、enemy(1)…)来代表四种类型不同的敌人,我们需要将小球添加到Perfeb文件夹内供后续使用。
创建名为Enemy的脚本文件,挂载到四个小球上并打开。通过此脚本我们的小球就可以自动驶向终点了:
//在Enemy类中输入如下代码
public float speed = 13;
private Transform[] positons;
private int index = 0;
在Unity中,脚本里以public修饰的字段都可以在类中进行赋值和修改操作,我们可以点击小球“enemy”来查看和调整speed变量。
以下为Enemy.cs中的代码:
public float speed = 13;
private Transform[] positons;
private int index = 0;
//start为开始事件,仅执行一次
private void Start()
{
//初始化:引入WayPoint类中的positions数组
positons = WayPoint.positions;
}
//更新事件,执行N次,每帧执行一次
private void Update()
{
Move();
}
private void Move()
{
//这个if是防止物体在移动过程里,
//访问弯道物体数组时产生越界错误而写的
//在越界前将直接停止执行函数
if(index > positons.Length - 1)
{
return;
}
//transform.Translate将让物体按照弯道物体数组的顺序移动,
//移动方向是目标弯道物体的位置,和挂载物体的位置差,使用normalized转换为单位向量之后与速度的乘积。
//也就是说,transform.Translate()中的传入的是一个Vector3对象
transform.Translate((positons[index].position - transform.position).normalized * Time.deltaTime * speed);
//这个if是为了让敌人到达目标位置时,自动前往数组中存储的下一个位置。
if (Vector3.Distance(positons[index].position, transform.position) < 0.2f)
{
index++;
}
}
至此,我们的小球已经可以自行前往终点了,在下一节中笔者将讲述如何通过预制体来产生多个小球,以及如何实现关卡中类似波次效果。