Unity3D 2D游戏开发 官方教程。(十二)

十二敌人动画控制

12.1动画控制
首先打开Enemy Animator Controller参考Player Animator Controller的打开方法。
12.2创建触发器
创建Animator Parameter参数EnemyAttack方法参考PlayerChop
12.3创建转换
建立动画转换联系参考Player操作。
EnemyIdle -> EnemyAttack
EnemyAttack -> EnemyIdle
修改属性参考PlayerChop的属性设置过程。
备注:所有操作都是基于Enemy1进行的。由于Enemy2是复制Enemy1所以动画控制不需要单独设置。
12.4 修改脚本
修改GameManager.cs代码如下:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class GameManager : MonoBehaviour 
{
    //延迟
    public float turnDelay = 0.1f;
    //敌人
    private List<Enemy> enemies;
    //敌人是否移动
    private bool enemiesMoving;
    public static GameManager instance = null;
    //关卡管理器脚本
    public BoardManager boardScript;
    //初始关卡数
    private int level =3;
    public int playerFoodPoints = 100;
    [HideInInspector]
    public bool playersTurn = true;

    void Awake () 
    {
        if (instance == null)
            instance = this;
        else
            Destroy(instance);
        DontDestroyOnLoad(gameObject);
        //初始化敌人信息
        enemies = new List<Enemy>();
        //初始化关卡脚本
        boardScript = GetComponent<BoardManager>();
        //初始化游戏
        InitGame();
    }
    public void GameOver()
    {
        //清空上一关敌人信息
        enemies.Clear();
        enabled =false;
    }
    //初始化游戏
    void InitGame()
    {
        boardScript.SetupScene(level);
    }
    IEnumerator MoveEnemies()
    {
        enemiesMoving = true;
        yield return new WaitForSeconds(turnDelay);
        if(enemies.Count == 0)
        {
            yield return new WaitForSeconds(turnDelay);
        }
        for(int i=0;i<enemies.Count;i++)
        {
            enemies[i].EnemyMove();
            yield return new WaitForSeconds(enemies[i].moveTime);
        }
        playersTurn = true;
        enemiesMoving = false;
    }
    void Update () 
    {
        if(playersTurn || enemiesMoving)
            return;
        StartCoroutine(MoveEnemies());
    }
    public void AddEnemyToList(Enemy script)
    {
        enemies.Add(script);
    }
}

修改Enemy.cs代码如下:

using UnityEngine;
using System.Collections;

public class Enemy : MovingObject 
{
    //对主角造成伤害
    public int playerDemage;
    //动画
    private Animator animator;
    //移动目标
    private Transform target;
    //每2回合移动一次
    private bool skipMove;
    protected override void Start () 
    {
        //保存敌人到list中
        GameManager.instance.AddEnemyToList(this);
        animator = GetComponent<Animator>();
        target = GameObject.FindGameObjectWithTag("Player").transform;
        base.Start();
    }
    protected override void AttemptMove<T>(int xDir,int yDir)
    {
        if(skipMove)
        {
            skipMove = false;
            return ;
        }
        base.AttemptMove<T>(xDir,yDir);
        skipMove = true;
    }
    public void EnemyMove()
    {
        int xDir = 0 ;
        int yDir = 0 ;
        //与主角同一x的时候,向主角移动
        if(Mathf.Abs(target.transform.position.x - transform.position.x) < float.Epsilon)
            yDir = target.transform.position.y > transform.position.y ? 1:-1;
        //不在同一x的时候,移动向主角x
        else
            xDir = target.transform.position.x > transform.position.x ? 1:-1;
        AttemptMove<Player>(xDir,yDir);
    }
    protected override void OnCantMove<T>(T component)
    {
        Player hitPlayer = component as Player;
        //碰撞主角
        animator.SetTrigger("EnemyAttack");
        hitPlayer.LoseFood(playerDemage);
    }
}

12.5附加组件
把Enemy.cs作为组件附加给Enemy1和Enemy2预制体。
设置Enemy Script/Blocking Layer值为BlockingLayer。
设置Enemy1预制体/Enemy Script/Player Damage值为10
设置Enemy2预制体/Enemy Script/Player Damage值为20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值