Bootstrap

【Unity植物大战僵尸】Zombie is coming:僵尸的移动(十)

目录

18、僵尸资源导入和初始化

19、僵尸行走

测试


18、僵尸资源导入和初始

动画目录管理
导入并并保存
重命名并把第一个放入控制器文件夹
修改僵尸的图层,首先添加僵尸的图层,并放在中间
此使僵尸可以动了,最后调整下僵尸的层级目录
调整下摄像机

19、僵尸行走

设置动画,由于僵尸有3套动作,所以都加载进去,然后僵尸生成时随机选择某一个动画,先根据第一个复制两个出来
然后再去修改它们2个的帧,删除原来的然后添加新的
在Zombie.cs中添加代码:
可以随机选择一个移动动画播放
全部为下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Zombie : MonoBehaviour
{
    private Animator animator;
    private Grid currGrid;
    // 僵尸速度表示1格speed秒,所以1/(speed)是每秒1/(speed)格 单位:格/秒
    private float speed = 6;
    void Start()
    {
        // 获得子物体的动画组件
        animator = GetComponentInChildren<Animator>();
        // 从[1,4)中随机一个整数
        int rangeWalk = Random.Range(1, 4);
        // 在初始化时随机播放一个动画
        switch (rangeWalk)
        {
            case 1:
                animator.Play("Zombie_Walk1");
                break;
            case 2:
                animator.Play("Zombie_Walk2");
                break;
            case 3:
                animator.Play("Zombie_Walk3");
                break;
        }
        GetGridByVerticalNum(0);
    }
    
    void Update()
    {
        Move();
    }
    
    /// <summary>
    /// 僵尸移动
    /// </summary>
    private void Move()
    {
        // 没有得到网格,没有僵尸
        if (currGrid == null) return;
        // -1.33f是一个网格的距离,所以-1.33f*(1/speed)等于每秒走了1.33f*(1/speed)的距离【速度】,然后乘上时间Time.deltaTime,就是每帧走的距离
        transform.Translate(new Vector2(-1.33f,0)*(1/speed)*Time.deltaTime);
    }
    /// <summary>
    /// 获取一个网格,并决定在第几排出现
    /// </summary>
    /// <param name="verticalNum"></param>
    private void GetGridByVerticalNum(int verticalNum)
    {
        // 得到网格
        currGrid = GridManager.instance.GetGridByVerticalNum(verticalNum);
        // x坐标不变,修正它的y坐标为网格的世界坐标
        transform.position = new Vector3(transform.position.x, currGrid.Position.y);
    }
    
}
在GridManager.cs中更新函数
此时出现bug
原因在于,两个存在调用的函数都在start中,所以可能要调用的还没有初始化
这里CreateGridsBaseGrid还没有调用,然后网格没有生成,就先调用了GetGridByVerticalNum函数导致报错,处理方法是将CreateGridsBaseGrid函数放到awake中去

测试

;