目次
この記事は完了です:
敵の生成、
戦闘インターフェイスの UI 表示と値の変更、プロンプト
インターフェイスの表示 (DOTween
プレイヤー情報管理 & レベル内のカード管理 (略)
1. 戦闘ユニット
1.1 ファイトマネージャー
バトルマネージャーはバトルシステムを指揮します。
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 ファイトユニット
戦闘ユニットの基本クラス: プレイヤーのターン、敵のターン、勝利、敗北...
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class FightUnit{
//1.初始化
public virtual void Init(){
}
//2.每帧执行
public virtual void OnUpdate(){
}
}
1.3 ファイトX:ファイトユニット
1.3.1 ファイトイン
戦闘に入る際には初期化が必要です。
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
戦闘ユニット:プレイヤーターン。
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 戦闘_敵ターン
戦闘ユニット:敵のターン。
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 ファイトウィン
戦闘ユニット: 勝利。
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 ファイトロス
戦闘ユニット: 失敗しました。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Fight_Loss : FightUnit{
public override void Init(){
}
public override void OnUpdate(){
}
}
2. プレイヤー情報
2.1 ロールマネージャー
所有カードや金貨などの情報を保存するプレイヤー情報管理クラス。
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 ゲームアプリ
GameApp.cs の Start() 関数に以下を追加します。
RoleManager.Instance.Init();
3. 敵
3.1 エネミーマネージャー
敵マネージャー、ゲーム内の敵を一元管理します。
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 敵
敵のスクリプト。
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. バトルカード
バトル カード マネージャーは、レベル内のカードを管理する責任があります。
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. 戦闘UI
5.1 戦闘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 UIManager
UI管理クラスは戦闘システムUIの管理を追加します。
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. プロンプトインターフェイス (DOTween)
6.1 ドットウィーン
準備: DOTween 関連のプラグインをダウンロードします。
DOTween 関連: DOTween の使用法
6.2 UIManager
まず、DOTween に対応する名前空間を導入します。
using DG.Tweening;
次に、表示プロンプト インターフェイスに対応するメソッドを追加します。
...
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.効果