从第一个塔防游戏入门Unity脚本(一:冲向终点的敌人)

博客中的素材源自SIKI学院的哔哩哔哩视频,在这里向大家推荐SIKI学院!视频地址:https://www.bilibili.com/video/BV15W411976h

因为笔者也是初学阶段,可能会犯下基本的错误,这里欢迎各位批评指正,由于笔者想要重点分享脚本部分,其他基础操作部分会尽量简略,希望能得到谅解。
unity类图

一、起步

我们需要准备官网的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变量。
以public修饰的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++;
        }
        
    }

至此,我们的小球已经可以自行前往终点了,在下一节中笔者将讲述如何通过预制体来产生多个小球,以及如何实现关卡中类似波次效果。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值