目录
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中去