2D横版跳跃游戏第三节

奖励系统

-奖励的动画-
将三个素材一起拖进secens(场景)里面
然后保存方式点到animation的文件夹里,会自动生成动画
2D横版跳跃游戏第三节
然后启动游戏 会发现奖励的动画会播放的很快
创建新的脚本 来改变它的旋转速度
新脚本放在刚建的奖励里
原理:用transform.Rotate来使它旋转 自定义旋转速度
public float speed = 20;//每秒旋转多少度

void Update ()
{
    transform.Rotate(-Vector3.forward * speed * Time.deltaTime);
    //改变它的旋转速度 -Vector3是因为正的会逆时针旋转 所以改成负的
}

保存脚本 启动游戏 自行调整旋转速度
-物理系统-
添加Box Collider 2D组件
添加新的标签 Aword
添加Audio Souce组件
后面会讲解为什么添加这些
竟然我们添加了Audio Souce组件 就是为了要播放音效
玩家吃掉奖励后播放的音效
在Main Camera建立新的脚本 名为AudioManager
原理:用audiow.PlayOneShot播放音效

 public static AudioManager _instance;//让其他脚本可以引用这个脚本
 public AudioClip collectibleAudioClip;//得到音源
private AudioSource audiow;//得到AudioSource组件

void Awake()
{
    _instance = this;//实例化
    audiow = this.GetComponent<AudioSource>();//获取AudioSource的组件

}

public void PlayCollectible()
{
    audiow.PlayOneShot(collectibleAudioClip);//播放一次音效
}

添加完这个脚本后 回到刚刚的奖励脚本里去
添加新函数

 public void OnTriggerEnter2D(Collider2D col)//这就是为什么之前要添加box 2D的组件
    {
        if(col.tag == "Player1")//判断碰到的标签是不是玩家//之前添加标签的原因
        {
            AudioManager._instance.PlayCollectible();//将播放音效的脚本引用到这里
            Destroy(this.gameObject);//把自己销毁
        }
    }

保存两个脚本 启动游戏 会发现吃掉奖励后 会播放音效和自动销毁奖励

敌人系统

-动画系统-
待机的动画跟上文建立奖励的动画过程一样
将素材拖进场景即可

建立run和死亡的动画
与第一节的建立玩家动画的过程一样
链接:点击我进第一节

-状态切换-
任何状态都可以切换到死亡状态 于是any state连接死亡的动画
idle和run状态可以互相切换 于是run动画和idle动画互相连接
2D横版跳跃游戏第三节
线连好了 我们就需要条件来让他们切换
与之前一样 用布尔值的false和true来让他们切换
添加 dead 和 run的布尔值
Any State(任何状态)连接 死亡动画 的布尔值用 dead 条件为 dead 为true时
idle连接run 的布尔值用 run 条件为 run 为 true时
run 连接 idle 的布尔值 用 run 条件为 run 为false时

状态切换设置完了以后添加Box Collider2D组件
然后我们就可以开始写敌人的AI脚本了
在敌人里添加新的脚本

public class enemy : MonoBehaviour
{
    private Transform player;//存储我们的主角 建立目标
    public float attackDistance = 25;//敌人的攻击距离
    private Animator anim;//添加动画组件
	void Start () { 
        player = GameObject.FindGameObjectsWithTag("Player").transform;//通过标签找到我们的玩家
        anim = this.GetComponent<Animator>();//获得动画组件

    }
	

	void Update () {
        float distance = Vector3.Distance(player.position,transform.position);//玩家与敌人的距离
        if (distance < attackDistance)//如果玩家与敌人的距离小于攻击距离
        {
            anim.SetBool("Run", true);//切换动画效果的条件
            if (player.position.x < transform.position.x)//玩家的x坐标小于敌人的x坐标 表示玩家在敌人的左边
            {
                transform.localScale = new Vector3(-1, 1, 1);//敌人朝向左边
            } else//玩家在敌人右边时
            {
                transform.localScale = new Vector3(1, 1, 1);//敌人朝向右边
            }
        }
        else
        {
            anim.SetBool("Run", false);
        }
    }
}

至此 保存脚本 开始游戏 查看效果
会发现敌人会始终看向玩家 并且相距一定距离会播放run动画
现在添加敌人跟随玩家的脚本

public float speed = 5;//敌人追玩家的速度
下面这段插在上面代码的if语句里
Vector3 dir = player.position - transform.position;//得到主角的方向
transform.position = dir.normalized * speed * Time.deltaTime + transform.position;
//让敌人追随玩家

保存脚本 开始游戏 会发现敌人会跟着玩家了
至此 本游戏教程完成