[Diario de desarrollo del juego 03] Sistema de combate

Este artículo está completo:
generación de enemigos,
visualización de la interfaz de usuario de batalla y cambio de valor,
visualización de la interfaz rápida (DOTentre
administración de información del jugador y administración de tarjetas dentro del nivel (abreviado

1. Unidad de combate

1.1 Administrador de lucha

El director de batalla lidera el sistema de batalla.

using System.Collections;
using System.Collections.Generic;
using System.Data;
using UnityEngine;
//战斗枚举
public enum FightType{
    
    
	None,
	Init,     //初始化
	Player,   //玩家
	Enemy,    //敌人
	Win,      //胜利
	Loss      //失败
}
public class FightManager : MonoBehaviour{
    
    
	public static FightManager Instance;   //单例
	public FightUnit fightUnit;            //战斗单元
	
	public int MaxHp;           //最大血量
	public int CurHp;           //当前血量
	public int MaxPowerCount;   //最大能量
	public int CurPowerCount;   //当前能量
	public int DefenseCount;    //防御值
	
	//1.初始化
	public void Init(){
    
    
		MaxHp = 10;
		CurHp = 10;
		MaxPowerCount = 10;
		CurPowerCount = 10;
		DefenseCount = 10;
	}

	public void Awake(){
    
    
		if(Instance==null) Instance = this;
		else Destory(gameObject);
	}
	public void Update(){
    
    
		if(fightUnit!=null) fightUnit.OnUpdate();
	}

	//2.切换战斗类型
	public void ChangeType(FightType type){
    
    
		switch(type){
    
    
			case FightType.None:
				break;
			case FightType.Init:
				fightUnit = new FightInit();
				break;
			case FightType.Player:
				fightUnit = new Fight_PlayerTurn();
				break;
			case FightType.Enemy:
				fightUnit = new Fight_EnemyTurn();
				break;
			case FightType.Win:
				fightUnit = new Fight_Win();
				break;
			case FightType.Loss:
				fightUnit = new Fight_Loss();
				break;
		}
		fightUnit.Init();
	}
}	

1.2 Unidad de lucha

Clase base de unidad de combate: turno de jugador, turno de enemigo, victoria, derrota...

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FightUnit{
    
    
	//1.初始化
	public virtual void Init(){
    
    }
	//2.每帧执行
	public virtual void OnUpdate(){
    
    }
}

1.3 FightX: Unidad de lucha

1.3.1 Luchas

Se requiere inicialización al entrar en combate.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FightInit : FightUnit{
    
    
	//1.初始化
	public override void Init(){
    
    
		//初始化战斗数值
		FightManager.Instance.Init();
		//切换bgm
		AudioManager.Instance.PlayBGM("battle");
		//敌人生成
		EnemyManager.Instance.LoadRes("10003");
		//初始化战斗卡牌
		FightManager.Instance.Init();
		//显示战斗界面
		UIManager.Instance.ShowUI<FightUI>("FightUI");
		//切换到玩家回合
		FightManager.Instance.ChangeType(FightType.Player);
	}
	//2.每帧更新
	public override void OnUpdate(){
    
    
		base.OnUpdate();
	}
}

1.3.2 Fight_PlayerTurn

Unidad de combate: turno de jugador.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fight_PlayerTurn : FightUnit{
    
    
	public override void Init() {
    
    
        Debug.Log("playertime");
        UIManager.Instance.ShowTip("玩家回合", Color.green, delegate () {
    
    
            //抽牌
            //Debug.Log("抽牌");
        });
    }
	public override void OnUpdate(){
    
    }
}

1.3.3 Fight_EnemyTurn

Unidad de combate: Turno enemigo.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fight_EnemyTurn : FightUnit{
    
    
	public override void Init(){
    
    }
	public override void OnUpdate(){
    
    }
}

1.3.4 Luchar_Ganar

Unidad de Combate: Victoria.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fight_Win : FightUnit{
    
    
	public override void Init(){
    
    }
	public override void OnUpdate(){
    
    }
}

1.3.5 Lucha_Pérdida

Unidad de combate: fallida.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fight_Loss : FightUnit{
    
    
	public override void Init(){
    
    }
	public override void OnUpdate(){
    
    }
}

2. Información del jugador

2.1 Administrador de funciones

Clase de gestión de información del jugador, que almacena información como tarjetas propias y monedas de oro.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RoleManager{
    
    
	//0.字段属性等
	public static RoleManager Instance = new RoleManager();
	public List<string> cardList;   //存储玩家拥有的卡牌id
	
	//1.初始化
	public void Init(){
    
    
		//实例化
		cardList = new List<string>();
		//4*攻击卡,4*防御卡,2*效果卡
		cardList.Add("1000");
		cardList.Add("1000");
		cardList.Add("1000");
		cardList.Add("1000");

		cardList.Add("1001");
		cardList.Add("1001");
		cardList.Add("1001");
		cardList.Add("1001");

		cardList.Add("1002");
		cardList.Add("1002");
	}
}

2.2 Aplicación de juego

Agregue lo siguiente en la función Start() de GameApp.cs:

RoleManager.Instance.Init();

3. enemigo

3.1 Administrador de enemigos

Administrador de enemigos, gestión unificada de enemigos en el juego.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyManager{
    
    
	public static EnemyManager Instance = new EnemyManager();
	private List<Enemy> enemyList;       //存储战斗中的敌人
	
	//1.加载敌人资源,id-关卡
	public void LoadRes(string id){
    
    
		//1.1 实例化容器
		enemyList = new List<Enemy>(); 
		
		//1.2 读取关卡表
		//Id	 Name	EnemyIds	        Pos
		//10003	 3	    10001=10002=10003	3,0,1=0,0,1=-3,0,1	
		Dictionary<string,string> levelData = GameConfigManager.Instance.GetLevelById(id);
		string[] enemyIds = levelData["EnemyIds"].Split('=');   //敌人id
        string[] enemyPos = levelData["Pos"].Split('=');        //敌人位置
		
		//1.3 生成敌人
		for(int i=0;i<enemyIds.Length;i++){
    
    
			//位置
			string[] posArr = enemyPos[i].Split(',');
            float x = float.Parse(posArr[0]);
            float y = float.Parse(posArr[1]);
            float z = float.Parse(posArr[2]);
            //敌人信息(根据id从敌人信息表中获取
            string enemyId = enemyIds[i];
            Dictionary<string, string> enemyData = GameConfigManager.Instance.GetEnemyById(enemyId);
            //生成敌人
            GameObject obj = Object.Instantiate(Resources.Load(enemyData["Model"])) as GameObject;
            Enemy enemy = obj.AddComponent<Enemy>();
            enemy.Init(enemyData);
            enemyList.Add(enemy);
            obj.transform.position = new Vector3(x, y, z);
		}	
	}
}

3.2 enemigo

Guión enemigo.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
//敌人行动枚举
public enum ActionType{
    
    
	None,
    Defend,  //防御
    Attack,  //攻击
}
public class Enemy : MonoBehaviour{
    
    
	protected Dictionary<string, string> data;   //敌人数据表信息
	
	public ActionType type;

	//UI
	public GameObject hpItemObj;   //血量条相关
    public GameObject actionObj;   //行动条相关
	public Transform attackTf;
    public Transform defendTf;
    public Text defendTxt;
    public Text hpTxt;
    public Image hpImag;
	
	//数值
	public int Defend;
    public int Attack;
    public int MaxHp;
    public int CurHp;

	//1.初始化
	public void Init(Dictionary<string,string> data) {
    
    
        this.data = data;
    }
	
	void Start()
    {
    
    
        type = ActionType.None;
        hpItemObj = UIManager.Instance.CreateHpItem();
        actionObj = UIManager.Instance.CreateActionIcon();


        attackTf = actionObj.transform.Find("attack");
        defendTf = actionObj.transform.Find("defend");

        defendTxt = hpItemObj.transform.Find("fangyu").GetComponent<Text>();
        hpTxt = hpItemObj.transform.Find("hpTxt").GetComponent<Text>();
        hpImag = hpItemObj.transform.Find("fill").GetComponent<Image>();

        //设置血条,行动条位置
        hpItemObj.transform.position = Camera.main.WorldToScreenPoint(transform.position+Vector3.down*0.2f);
        actionObj.transform.position = Camera.main.WorldToScreenPoint(transform.Find("head").position+Vector3.up*0.05f);

        SetRandomAction();

        //初始化数值
        Attack = int.Parse(data["Attack"]);
        CurHp = int.Parse(data["Hp"]);
        MaxHp = CurHp;
        Defend = int.Parse(data["Defend"]);
    }
	
	//2.随机一个行动
	public void SetRandomAction() {
    
    
        int ran = Random.Range(1, 3);
        type = (ActionType)ran;
        switch (type) {
    
    
            case ActionType.None:
                break;
            case ActionType.Defend:
                attackTf.gameObject.SetActive(false);
                defendTf.gameObject.SetActive(true);
                break;
            case ActionType.Attack:
                attackTf.gameObject.SetActive(true);
                defendTf.gameObject.SetActive(false);
                break;
        }
    }

	//3.更新血量信息
	public void UpdateHp() {
    
    
        hpTxt.text = CurHp + "/" + MaxHp;
        hpImag.fillAmount = (float)CurHp / (float)MaxHp;
    }

	//4.更新防御信息
	public void UpdateDefend() {
    
    
        defendTxt.text = Defend.ToString();
    }
}

4. Cartas de batalla

El administrador de cartas de batalla es responsable de administrar las cartas del nivel.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//1. 初始化
public class FightCardManager{
    
    
	public static FightCardManager Instance = new FightCardManager();
    public List<string> cardList;        //卡牌集合
    public List<string> usedCardList;    //弃牌堆
    //1.初始化
    public void Init(){
    
    
    	cardList = new List<string>();
        usedCardList = new List<string>();

		//定义临时集合存储玩家卡牌
		//AddRange(x):加入x内的所有元素
		List<string> tempList = new List<string>();
        tempList.AddRange(RoleManager.Instance.cardList);
        while (tempList.Count > 0) {
    
    
            //随机下标
            int tempIndex = Random.Range(0, tempList.Count);
            //添加到卡牌
            cardList.Add(tempList[tempIndex]);
            //临时集合删除
            tempList.RemoveAt(tempIndex);
        }
    }
}

5. IU de combate

5.1 Lucha UI

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class FightUI : UIBase{
    
    
	private Text cardCountTxt;     //卡牌数量
    private Text noCardCountTxt;   //弃牌堆卡牌数量
    private Text powerTxt;         //能量数量
    private Text hpTxt;            //血量
    private Image hpImg;           //血量图像
    private Text fyTxt;            //防御值

	private void Awake(){
    
    
		cardCountTxt = transform.Find("hasCard/icon/Text").GetComponent<Text>();
        noCardCountTxt = transform.Find("noCard/icon/Text").GetComponent<Text>();
        powerTxt = transform.Find("mana/Text").GetComponent<Text>();
        hpTxt = transform.Find("hp/moneyTxt").GetComponent<Text>();
        hpImg = transform.Find("hp/fill").GetComponent<Image>();
        fyTxt = transform.Find("hp/fangyu/Text").GetComponent<Text>();
	}

	private void Start(){
    
    
		UpdateHp();
        UpdatePower();
        UpdateDefense();
        UpdateCardCount();
        UpdateUsedCardCount();
	}

	 //1.更新血量显示
    public void UpdateHp() {
    
    
        hpTxt.text = FightManager.Instance.CurHp + "/" + FightManager.Instance.MaxHp;
        hpImg.fillAmount = (float)FightManager.Instance.CurHp / (float)FightManager.Instance.MaxHp;
    }

    //2.更新血量
    public void UpdatePower() {
    
    
        powerTxt.text = FightManager.Instance.CurPowerCount + "/" + FightManager.Instance.MaxPowerCount;
    }

    //3.更新防御
    public void UpdateDefense() {
    
    
        fyTxt.text = FightManager.Instance.DefenseCount.ToString();
    }

    //4.更新卡堆数量
    public void UpdateCardCount() {
    
    
        cardCountTxt.text = FightCardManager.Instance.cardList.Count.ToString();
    }

    //5.更新弃牌堆数量
    public void UpdateUsedCardCount() {
    
    
        noCardCountTxt.text = FightCardManager.Instance.usedCardList.Count.ToString();
    }
}

5.2 Administrador de UI

La clase de gestión de UI añade gestión de la UI del sistema de batalla.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
public class UIManager : MonoBehaviour{
    
    
	...
	//方法4:显示行动逻辑(敌人头部的行动图标
    public GameObject CreateActionIcon() {
    
    
        GameObject obj = Instantiate(Resources.Load("UI/actionIcon"), canvasTF) as GameObject;
        obj.transform.SetAsLastSibling();  //设置在父级的最后一位
        return obj;
    }
    //方法5:显示敌人底部的血量条
    public GameObject CreateHpItem() {
    
    
        GameObject obj = Instantiate(Resources.Load("UI/HpItem"), canvasTF) as GameObject;
        obj.transform.SetAsLastSibling();  //设置在父级的最后一位
        return obj;
    }
}

6. Interfaz rápida (DOTween

6.1 PUNTOentre

Preparación: descargue los complementos relacionados con DOTween.

DOTentre
Relacionado con DOTween: uso de DOTween

6.2 Administrador de UI

Primero introduzca el espacio de nombres correspondiente a DOTween:

using DG.Tweening;

Luego agregue el método correspondiente a la interfaz del mensaje de visualización:

...
public class UIManager : MonoBehaviour{
    
    
	...
	//方法6:显示提示界面
    //方法6:显示提示界面
    public void ShowTip(string msg,Color color,System.Action callback = null){
    
    
        //UI相关
        GameObject obj = Instantiate(Resources.Load("UI/Tips"), canvasTF) as GameObject;
        Text text = obj.transform.Find("bg/Text").GetComponent<Text>();
        text.color = color;
        text.text = msg;
        //DOScale/DOScaleX/DOScaleY/DOScaleZ(float to, float duration),缩放
        //to(目标值)、duration(持续时间)
        Tween scale1 = obj.transform.Find("bg").DOScaleY(1, 0.4f);
        Tween scale2 = obj.transform.Find("bg").DOScaleY(1, 0.4f);
        Sequence seq = DOTween.Sequence();  //动画序列
        seq.Append(scale1);                 //添加一段动画到序列末尾
        seq.AppendInterval(0.5f);           //添加一段空动画到序列末尾
        //seq.Append(scale2);             
        seq.AppendCallback(delegate () {
    
        //回调函数:根据逻辑动态选择是否调用
            if (callback != null) {
    
    
                callback();
            }
        });
        MonoBehaviour.Destroy(obj, 2);
    }
}

7. Efecto

imagen
Efecto

Supongo que te gusta

Origin blog.csdn.net/manpi/article/details/129329268
Recomendado
Clasificación