#游戏unity-音之国度#战斗系统中的回合制

#游戏unity-音之国度#战斗系统中的回合制

转载需标明出处

在上一篇博客中,我们介绍了实现回合制的代码中的新内容——协程,这篇博客我们就真正的来实现一个回合制游戏;首先,一般的回合制游戏都是自己与敌人接连出招,然后当一方血量为0是终止战斗,而我们的音符兽(主角)有不同的类型,相对应的就有不同的种类特点——例如,有的就会在受到攻击后,自动进行反击,而反击的血量在一个较低的数值范围内随机产生,基于这样的思想,我们可以增加一定几率的敌人的反击算法。
主要的运行流程就是在对战开始后,几秒后自动进入己方出战,出来技能框,选择技能,然后主要的一点就是交换攻击权限,由对方攻击;而这个攻击权限就由一个布尔值来控制,如下:
这里写图片描述
我用的是Animation组件
#游戏unity-音之国度#战斗系统中的回合制_第1张图片

好了废话少说上绑在主角身上的脚本Player

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour
{

    public int HP = 100;

    //等待玩家操作  
    public bool isWaitPlayer = true;
    public bool ifUIshow = true;

    //动画组件  
    private Animation mAnim;

    // Use this for initialization  
    void Start()
    {
        mAnim = this.GetComponent();
        mAnim.Play("Walk");

    }

    //伤害  
    void OnDamage(int mValue)
    {
        HP -= mValue;
    }


    public void OnGUI()
    {
        //如果处于等待状态,则显示操作窗口  
        if (isWaitPlayer && ifUIshow)
        {
            GUI.Window(0, new Rect(Screen.width / 2 + 150, Screen.height / 2 + 150, 200, 200), InitWindow, "请选择技能");
            //  mAnim.Play("skill");
            mAnim.Play("Walk");
        }
    }


    void InitWindow(int ID)
    {
        if (GUI.Button(new Rect(0, 20, 200, 30), "攻击"))
        {

            mAnim.Play("Run");
            OnDamage(10);
            //交换操作权  
            isWaitPlayer = false;
            ifUIshow = false;
        }
        if (GUI.Button(new Rect(0, 50, 200, 30), "法术"))
        {
            OnDamage(10);
            mAnim.Play("Dying");
            //交换操作权  
            isWaitPlayer = false;
            ifUIshow = false;
        }
    }

    // Update is called once per frame  
    void Update()
    {

    }
}

绑在敌人身上的脚本

using UnityEngine;
using System.Collections;

public class Monster : MonoBehaviour
{

    public int HP = 100;
    public bool isWaitPlayer = true;

    //动画组件  

    private Animation mAnim;

    // Use this for initialization  
    void Start()
    {
        mAnim = this.GetComponent();
        mAnim.Play("Walk");
    }


    void OnDamage(int mValue)
    {
        HP -= mValue;
    }

    //敌人AI算法  
    public void StartAI()
    {
        if (!isWaitPlayer)
        {
            if (HP > 20)
            {
                //80%  
                if (Random.Range(1, 5) % 5 != 1)
                {
                    mAnim.Play("Dying");
                    // mAnim.SetBool("enemyAttack", true);
                    //ondamage  
                    isWaitPlayer = true;
                }
                //20%  
                else
                {
                    mAnim.Play("Dying");
                    isWaitPlayer = true;
                }
            }
            else
            {
                switch (Random.Range(1, 5) % 5)
                {
                    case 0:
                        mAnim.Play("Dying");
                        isWaitPlayer = true;
                        break;
                }
            }
        }
    }

    // Update is called once per frame  
    void Update()
    {
        if (isWaitPlayer)
        {
            mAnim.Play("Walk");
        }
    }
}

后台控制的总脚本control——其中就有上一篇所讲到的协程函数的运用



using UnityEngine;
using System.Collections;


public class control : MonoBehaviour
{

    //动画组件  
    private Animation mAnim;

    //定义玩家及敌人  
    public Transform mPlayer;
    public Transform mEnemy;

    //定义玩家及敌人脚本类  
    private Player playerScript;
    private Monster enemyScript;

    //默认操作状态为玩家操作  
    private OperatorState mState = OperatorState.Player;

    //定义操作状态枚举  
    public enum OperatorState
    {
        Quit,
        EnemyAI,
        Player
    }

    // Use this for initialization  
    void Start()
    {

        mAnim = mPlayer.GetComponent();

        //获取玩家及敌人脚本类  
        playerScript = mPlayer.GetComponent();
        enemyScript = mEnemy.GetComponent();
        playerScript.OnGUI();
    }

    //UI延迟4.5秒调出  
    IEnumerator WaitUI()
    {
        yield return new WaitForSeconds(1F);
        enemyScript.isWaitPlayer = true;
        playerScript.ifUIshow = true;

    }

    //  
    IEnumerator WaitAI()
    {
        yield return new WaitForSeconds(2.0F);
        enemyScript.isWaitPlayer = false;
    }

    //为怪物AI延迟3秒  
    IEnumerator UpdateLater()
    {
        yield return new WaitForSeconds(3.0F);
        //敌人停止等待  
        enemyScript.isWaitPlayer = false;
        //敌人执行AI  
        enemyScript.StartAI();
    }

    // Update is called once per frame  
    void Update()
    {
        //如果敌我双方有一方生命值为0,则游戏结束  
        if (playerScript.HP == 0)
        {
            mState = OperatorState.Quit;
            Debug.Log("游戏失败");
        }
        else if (enemyScript.HP == 0)
        {
            mState = OperatorState.Quit;
            Debug.Log("游戏胜利");
        }
        else
        {
            switch (mState)
            {
                case OperatorState.Player:
                    {
                        if (!playerScript.isWaitPlayer)
                        {
                            StartCoroutine("UpdateLater");
                            StartCoroutine("WaitUI");
                            mState = OperatorState.EnemyAI;
                        }
                        break;
                    }
                case OperatorState.EnemyAI:
                    {
                        if (enemyScript.isWaitPlayer)
                        {
                            StartCoroutine("WaitAI");
                            playerScript.isWaitPlayer = true;
                            mState = OperatorState.Player;


                            mAnim.Play("Walk");
                        }
                        break;
                    }
            }
        }
    }
}

#游戏unity-音之国度#战斗系统中的回合制_第2张图片
至此,回合制对战的基本代码书写完成。

你可能感兴趣的:(游戏,unity)