RPG项目01_UI面板Game

基于"RPG项目01_技能释放",将UI包导入Unity场景中,

将图片放置

拖拽

取消勾选(隐藏攻击切片)

对技能添加蒙版

调节父子物体大小一致

将子类蒙版复制

执行5次

运行即可看到技能使用完的冷却条

在Scripts下创建UI文件夹

写代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.Events;

using UnityEngine.UI;

public class UIBase : MonoBehaviour

{

public Transform btnParent;

public GameObject prefab;

public UnityAction<int> funClickHandle;

public UITween tween;

protected List<RectTransform> childRect = new List<RectTransform>();

protected Button btnBack;

protected Text text;

protected void Init()

{

tween = GetComponent<UITween>();

btnBack = GameManager.FindType<Button>(transform, "BtnX");

btnBack.onClick.AddListener(tween.UIBack);

}

protected void ClearBtn(Transform parent) {

foreach (Transform t in parent) {

Destroy(t.gameObject);

}

}

public virtual void UpdateValue() {

}

public virtual void MenuStart(params UITween[] uis) {

foreach (UITween item in uis) {

item.UIStart();

}

}

}

再UI文件夹下创建PlayerPanel代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

public class PlayerPanel : UIBase

{

Header("==============子类变量================")

public UIBase panelMsn;

public UIBase panelBag;

Button btnMsn;

Button btnBag;

static Image hpImage;

static Image mpImage;

void Start()

{

hpImage = GameManager.FindType<Image>(transform, "MainUI/Hp");

mpImage = GameManager.FindType<Image>(transform, "MainUI/Mp");

btnMsn = GameManager.FindType<Button>(transform, "BtnMission");

btnBag = GameManager.FindType<Button>(transform

, "BtnBag");

btnMsn.onClick.AddListener(delegate

{

panelMsn.MenuStart(panelMsn.GetComponent<UITween>());

});

btnBag.onClick.AddListener(delegate

{

//获取全部挂在UITween脚本的组件形成数组不定参数

panelBag.MenuStart(panelBag.GetComponentsInChildren<UITween>());

});

for (int i = 0; i < btnParent.childCount; i++)

{

Button btn = GameManager.FindType<Button>(btnParent, "BtnSkill" + i);

int n = i;

btn.onClick.AddListener(delegate {

MainGame.player.SkillClick(n + 1);

});

}

}

//刷新血量

public static void UpdateHpUI(float hpValue, float mpValue)

{

hpImage.fillAmount = hpValue;

mpImage.fillAmount = mpValue;

}

}

将PalyerPanel挂载在MainPanel上

新增MaPlayer代码:

protected override void UpdateUI()

{

PlayerPanel.UpdateHpUI(GetHpRation(), (float)Mp/MpMax);

}

将初始mp/最大mp调少一点:

运行E拔刀后F1释放技能即可看到mp蓝条减少

添加代码:

public void SkillClick(int num)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

选中技能1-6添加Button组件

新增PlayerPanel代码:(找到按钮)

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++点击技能释放技能缺少button事件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

加入新按钮,

删除旧按钮,

新增两个到Bag包下

删除两个

delete

挪动Text位置

复制道具框,

在Content上增加尺寸适配器组件(自动计算)通常和Grid Layout Group配合使用

设置自动隐藏(当需要滚动条的时候显示,不需要时隐藏)

此时,两侧面板基本完成

新建代码BagPanel

代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

public class BagPanel : UIBase{

Transform canvas;

Transform bagTran;

Transform equipTran;

Button btnTakeOff;

Text textHp;

Text textMp;

Text textLv;

Text textExp;

Text textAtt;

Text textDef;

Text textSpd;

Text textMdf;

private void Start(){

}

public void InitText(){

canvas = MainGame.canvas;

bagTran = transform.Find("Bag");

equipTran = transform.Find("Equip");

text = GameManager.FindType<Text>(bagTran, "TextGold");

Transform temp = equipTran.Find("TextParent");

textHp = GameManager.FindType<Text>(temp, "TextHp");

textMp = GameManager.FindType<Text>(temp, "TextMp");

textLv = GameManager.FindType<Text>(temp, "TextLv");

textExp = GameManager.FindType<Text>(temp, "TextExp");

textAtt = GameManager.FindType<Text>(temp, "TextAtt");

textDef = GameManager.FindType<Text>(temp, "TextDef");

textSpd = GameManager.FindType<Text>(temp, "TextSpd");

textMdf = GameManager.FindType<Text>(temp, "TextMdf");

}

}

新增MainPanel代码类段代码:

Message.CheckMessage();

修改Text为TextGold

在Canvas下创建Image

选一张图片

添加组件

添加组件

添加事件类型

再做一下鼠标移动到图标就会消失功能:

鼠标到图标位置,图标就会消失

知识点:如果用Selectable和Event Trigger就可以替代Button按钮做更复杂的UI

新建脚本道具类GameObj

using System;

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

//药品,装备

public enum ObjType { None, Drug, Equip };

//装备包含:

public enum EquipType { None, Helmet, Armor, Boots, Weapon, Shield };

//装备数据

public class GameObj{

public string oname;

public string msg;

public int idx;

public string type;

public int _hp;

public int _mp;

public int _def;

public int _mdf;

public int _att;

public int _spd;

public bool isTakeOn;//判断是否穿上

public virtual void UseObjValue(){

}

public virtual void TakeOff(){

}

public virtual void TakeOn(){

}

}

修改BagPanel代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.InputSystem;

using UnityEngine.UI;

public class BagPanel : UIBase{

Transform canvas;

Transform bagTran;

Transform equipTran;

Button btnTakeOff;

Text textHp;

Text textMp;

Text textLv;

Text textExp;

Text textAtt;

Text textDef;

Text textSpd;

Text textMdf;

void Start(){

}

public void InitText(){

canvas = MainGame.canvas;

bagTran = transform.Find("Bag");

equipTran = transform.Find("Equip");

text = GameManager.FindType<Text>(bagTran, "TextGold");

Transform temp = equipTran.Find("TextParent");

textHp = GameManager.FindType<Text>(temp, "TextHp");

textMp = GameManager.FindType<Text>(temp, "TextMp");

textLv = GameManager.FindType<Text>(temp, "TextLv");

textExp = GameManager.FindType<Text>(temp, "TextExp");

textAtt = GameManager.FindType<Text>(temp, "TextAtt");

textDef = GameManager.FindType<Text>(temp, "TextDef");

textSpd = GameManager.FindType<Text>(temp, "TextSpd");

textMdf = GameManager.FindType<Text>(temp, "TextMdf");

}

void AddEvent(GameObj obj, GameObject btn)

{

Image image = btn.GetComponent<Image>();

EventTrigger et = btn.GetComponent<EventTrigger>();

if (!et)

{

et = btn.AddComponent<EventTrigger>();

}

EventTrigger.Entry entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.BeginDrag;//开始拖拽

entry.callback.AddListener(delegate

{

image.raycastTarget = false;

btn.transform.SetParent(canvas);

}

);

et.triggers.Add(entry);

//

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.Drag;//拖拽中

entry.callback.AddListener(delegate (BaseEventData arg)

{

PointerEventData ped = (PointerEventData)arg;//将基础数据变成鼠标数据

Vector3 newPos;

RectTransformUtility.ScreenPointToWorldPointInRectangle(

btn.GetComponent<RectTransform>(), Mouse.current.position.ReadValue(),//在摄像机视角下鼠标当前坐标转换过去

ped.enterEventCamera, out newPos);

btn.transform.position = newPos;

}

);

et.triggers.Add(entry);

/;

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.EndDrag;//结束拖拽

entry.callback.AddListener(delegate (BaseEventData arg)

{

if (!EventSystem.current.IsPointerOverGameObject())

{

btn.transform.parent = btnParent;

image.raycastTarget = true;

return;

}

PointerEventData ped = (PointerEventData)arg;

Transform target = ped.pointerEnter.transform;

if (target)

{

if (target.tag == obj.GetType().ToString())

{

obj.TakeOn();

//交换装备

ChangeGameObj(target.parent, btn);

//刷新数值

UpdatePlayerValue();

}

else if (target.name == obj.GetType().ToString() || target.name == obj.type)

{

//交换药品

ChangeGameObj(target, btn);

}

else

{

obj.isTakeOn = false;

btn.transform.parent = btnParent;

}

}

image.raycastTarget = true;

}

);

et.triggers.Add(entry);

/

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.PointerClick;//拖拽中

entry.callback.AddListener(delegate (BaseEventData arg)

{

if (btn.tag != ObjType.Drug.ToString())

{

return;

}

//MainGame.player.UseDrugObj(btn.transform);

}

);

et.triggers.Add(entry);

}

//刷新玩家数据

public void UpdatePlayerValue()

{

textHp.text = "生命:" + MainGame.player.Hp + "/" + MainGame.player.HpMax;

textMp.text = "魔力:" + MainGame.player.Mp + "/" + MainGame.player.MpMax;

textAtt.text = "攻击:" + MainGame.player.Att;

textDef.text = "防御:" + MainGame.player.Def;

textMdf.text = "魔抗:" + MainGame.player.Mdf;

textSpd.text = "速度:" + MainGame.player.Spd;

textLv.text = "等级:" + MainGame.player.lv;

textExp.text = "经验:" + MainGame.player.Exp;

}

void ChangeGameObj(Transform target, GameObject btn)

{

GameObj temp = new GameObj();

if (target.childCount >= 2)

{

//temp = GameManager.GetGameObj(target.GetChild(0).name);

//SetBtnTakeOff(target.GetChild(0), temp);

}

btn.transform.parent = target.transform;

btn.transform.SetAsFirstSibling();

btn.transform.localPosition = Vector3.zero;

btn.GetComponent<RectTransform>().sizeDelta = target.GetComponent<RectTransform>().sizeDelta;

//temp = GameManager.GetGameObj(btn.name);

if (temp != null)

{

temp.isTakeOn = true;

}

}

void SetBtnTakeOff(Transform btn, GameObj obj)

{

if (obj != null)

{

btn.parent = btnParent;

obj.isTakeOn = false;

btn.GetComponent<Image>().raycastTarget = true;

}

}

}

修改GameManager类:

using System.Collections.Generic;

using System.Xml;

using Unity.VisualScripting;

using UnityEngine;

public enum GameState { Play,Menu };

public class GameManager

{

//当只需要一个的时候使用静态类

public static GameState gameState = GameState.Play;

//物品库

public static Dictionary<string, GameObj> goods = new Dictionary<string, GameObj>();

public static void Init()

{

}

public static T FindType<T>(Transform t, string n)

{

return t.Find(n).GetComponent<T>();

}

public static T ParseEnum<T>(string value)

{

return (T)System.Enum.Parse(typeof(T), value, true);

}

#region 添加物品库

//读取XML文件

public static void SetGoods()

{

TextAsset t = LoadManager.LoadXml("XML");

XmlDocument xml = new XmlDocument();

xml.LoadXml(t.ToString().Trim());

XmlElement root = xml.DocumentElement;

XmlElement oInfo = (XmlElement)root.SelectSingleNode("DrugInfo");

//节点列表 获取所有子节点

XmlNodeList nodeList = oInfo.ChildNodes;

foreach (XmlElement item in nodeList)

{

//Drug drug = new Drug();

//drug.oname = item.GetAttribute("Name");

//drug.msg = item.GetAttribute("Msg");

//drug.idx = int.Parse(item.GetAttribute("Idx"));

//drug.type = item.GetAttribute("Type");

//drug._hp = int.Parse(item.GetAttribute("Hp"));

//drug._mp = int.Parse(item.GetAttribute("Mp"));

//AddGoodDict(drug);

}

// oInfo = (XmlElement)root.SelectSingleNode("EquipInfo");

// nodeList = oInfo.ChildNodes;//每一个节点

// foreach (XmlElement item in nodeList)

// {

// Equip eq = new Equip();

// eq.oname = item.GetAttribute("Name");

// eq.msg = item.GetAttribute("Msg");

// eq.idx = int.Parse(item.GetAttribute("Idx"));

// eq.type = item.GetAttribute("Type");

// eq._att = int.Parse(item.GetAttribute("Att"));

// eq._def = int.Parse(item.GetAttribute("Def"));

// eq._mdf = int.Parse(item.GetAttribute("Mdf"));

// eq._spd = int.Parse(item.GetAttribute("Spd"));

// AddGoodDict(eq);

// }

//}

//public static void AddGoodDict(GameObj obj)

//{

// if (obj == null)

// {

// return;

// }

// goods.Add(obj.oname, obj);

//}

//public static GameObj GetGameObj(string name)

//{

// if (goods.ContainsKey(name))

// {

// return goods[name];

// }

// else

// {

// return null;

// }

//}

//public static GameObj GetGameObj(int idx)

//{

// foreach (GameObj item in goods.Values)

// {

// if (item.idx == idx)

// {

// return item;

// }

// }

// return null;

//}

#endregion

}

}

新建脚本药品类Drug

代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Drug : GameObj

{

public override void UseObjValue()

{

MainGame.player.AddHp(_hp);

MainGame.player.AddMp(_mp);

}

}

继续修改GameManager代码:

using System.Collections.Generic;

using System.Xml;

using Unity.VisualScripting;

using UnityEngine;

public enum GameState { Play,Menu };

public class GameManager

{

//当只需要一个的时候使用静态类

public static GameState gameState = GameState.Play;

//物品库

public static Dictionary<string, GameObj> goods = new Dictionary<string, GameObj>();

public static void Init()

{

}

public static T FindType<T>(Transform t, string n)

{

return t.Find(n).GetComponent<T>();

}

public static T ParseEnum<T>(string value)

{

return (T)System.Enum.Parse(typeof(T), value, true);

}

#region 添加物品库

//读取XML文件

public static void SetGoods()

{

TextAsset t = LoadManager.LoadXml("XML");

XmlDocument xml = new XmlDocument();

xml.LoadXml(t.ToString().Trim());

XmlElement root = xml.DocumentElement;

XmlElement oInfo = (XmlElement)root.SelectSingleNode("DrugInfo");

//节点列表 获取所有子节点

XmlNodeList nodeList = oInfo.ChildNodes;

foreach (XmlElement item in nodeList)

{

Drug drug = new Drug();

drug.oname = item.GetAttribute("Name");

drug.msg = item.GetAttribute("Msg");

drug.idx = int.Parse(item.GetAttribute("Idx"));

drug.type = item.GetAttribute("Type");

drug._hp = int.Parse(item.GetAttribute("Hp"));

drug._mp = int.Parse(item.GetAttribute("Mp"));

AddGoodDict(drug);

}

//oInfo = (XmlElement)root.SelectSingleNode("EquipInfo");

//nodeList = oInfo.ChildNodes;//每一个节点

//foreach (XmlElement item in nodeList)

//{

// Equip eq = new Equip();

// eq.oname = item.GetAttribute("Name");

// eq.msg = item.GetAttribute("Msg");

// eq.idx = int.Parse(item.GetAttribute("Idx"));

// eq.type = item.GetAttribute("Type");

// eq._att = int.Parse(item.GetAttribute("Att"));

// eq._def = int.Parse(item.GetAttribute("Def"));

// eq._mdf = int.Parse(item.GetAttribute("Mdf"));

// eq._spd = int.Parse(item.GetAttribute("Spd"));

// AddGoodDict(eq);

//}

}

public static void AddGoodDict(GameObj obj)

{

if (obj == null)

{

return;

}

goods.Add(obj.oname, obj);

}

//public static GameObj GetGameObj(string name)

//{

// if (goods.ContainsKey(name))

// {

// return goods[name];

// }

// else

// {

// return null;

// }

//}

//public static GameObj GetGameObj(int idx)

//{

// foreach (GameObj item in goods.Values)

// {

// if (item.idx == idx)

// {

// return item;

// }

// }

// return null;

//}

#endregion

}

再创建Equip道具类

代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Equip : GameObj

{

public override void TakeOff()

{

//

}

}

继续修改GameManager类:

using System.Collections.Generic;

using System.Xml;

using Unity.VisualScripting;

using UnityEngine;

public enum GameState { Play,Menu };

public class GameManager

{

//当只需要一个的时候使用静态类

public static GameState gameState = GameState.Play;

//物品库

public static Dictionary<string, GameObj> goods = new Dictionary<string, GameObj>();

public static void Init()

{

SetGoods();

}

public static T FindType<T>(Transform t, string n)

{

return t.Find(n).GetComponent<T>();

}

public static T ParseEnum<T>(string value)

{

return (T)System.Enum.Parse(typeof(T), value, true);

}

#region 添加物品库

//读取XML文件

public static void SetGoods()

{

TextAsset t = LoadManager.LoadXml("XML");

XmlDocument xml = new XmlDocument();

xml.LoadXml(t.ToString().Trim());

XmlElement root = xml.DocumentElement;

XmlElement oInfo = (XmlElement)root.SelectSingleNode("DrugInfo");

//节点列表 获取所有子节点

XmlNodeList nodeList = oInfo.ChildNodes;

foreach (XmlElement item in nodeList)

{

Drug drug = new Drug();

drug.oname = item.GetAttribute("Name");

drug.msg = item.GetAttribute("Msg");

drug.idx = int.Parse(item.GetAttribute("Idx"));

drug.type = item.GetAttribute("Type");

drug._hp = int.Parse(item.GetAttribute("Hp"));

drug._mp = int.Parse(item.GetAttribute("Mp"));

AddGoodDict(drug);

}

oInfo = (XmlElement)root.SelectSingleNode("EquipInfo");

//节点列表 获取所有子节点

nodeList = oInfo.ChildNodes;

foreach (XmlElement item in nodeList)

{

//alt + 回车 一键全改错误eq

Equip eqq = new Equip();

eqq.oname = item.GetAttribute("Name");

eqq.msg = item.GetAttribute("Msg");

eqq.idx = int.Parse(item.GetAttribute("Idx"));

eqq.type = item.GetAttribute("Type");

eqq._att = int.Parse(item.GetAttribute("Att"));

eqq._def = int.Parse(item.GetAttribute("Def"));

eqq._mdf = int.Parse(item.GetAttribute("Mdf"));

eqq._spd = int.Parse(item.GetAttribute("Spd"));

AddGoodDict(eqq);

}

}

public static void AddGoodDict(GameObj obj)

{

if (obj == null)

{

return;

}

goods.Add(obj.oname, obj);

}

public static GameObj GetGameObj(string name)

{

if (goods.ContainsKey(name))

{

return goods[name];

}

else

{

return null;

}

}

public static GameObj GetGameObj(int idx)

{

foreach (GameObj item in goods.Values)

{

if (item.idx == idx)

{

return item;

}

}

return null;

}

#endregion

}

修改BagPanel类:

修改背包面板BagPanel代码,在Start下加内容:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.InputSystem;

using UnityEngine.UI;

public class BagPanel : UIBase{

Transform canvas;

Transform bagTran;

Transform equipTran;

Button btnTakeOff;

Text textHp;

Text textMp;

Text textLv;

Text textExp;

Text textAtt;

Text textDef;

Text textSpd;

Text textMdf;

void Start(){

InitText();

btnTakeOff = GameManager.FindType<Button>(equipTran, "BtnTakeOff");

btnTakeOff.onClick.AddListener(delegate

{

foreach (Transform item in equipTran.Find("Eq"))

{

if (item.childCount >= 2)

{

GameObj temp = GameManager.GetGameObj(item.GetChild(0).name);

temp.TakeOff();

UpdatePlayerValue();

SetBtnTakeOff(item.GetChild(0), temp);

}

}

});

tween = bagTran.GetComponent<UITween>();

tween.AddEventStartHandle(UpdateValue);

btnBack = GameManager.FindType<Button>(bagTran, "BtnX");

btnBack.onClick.AddListener(delegate

{

tween.UIBack();

equipTran.GetComponent<UITween>().UIBack();

});

}

public void InitText(){

canvas = MainGame.canvas;

bagTran = transform.Find("Bag");

equipTran = transform.Find("Equip");

text = GameManager.FindType<Text>(bagTran, "TextGold");

Transform temp = equipTran.Find("TextParent");

textHp = GameManager.FindType<Text>(temp, "TextHp");

textMp = GameManager.FindType<Text>(temp, "TextMp");

textLv = GameManager.FindType<Text>(temp, "TextLv");

textExp = GameManager.FindType<Text>(temp, "TextExp");

textAtt = GameManager.FindType<Text>(temp, "TextAtt");

textDef = GameManager.FindType<Text>(temp, "TextDef");

textSpd = GameManager.FindType<Text>(temp, "TextSpd");

textMdf = GameManager.FindType<Text>(temp, "TextMdf");

}

void AddEvent(GameObj obj, GameObject btn)

{

Image image = btn.GetComponent<Image>();

EventTrigger et = btn.GetComponent<EventTrigger>();

if (!et)

{

et = btn.AddComponent<EventTrigger>();

}

EventTrigger.Entry entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.BeginDrag;//开始拖拽

entry.callback.AddListener(delegate

{

image.raycastTarget = false;

btn.transform.SetParent(canvas);

}

);

et.triggers.Add(entry);

//

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.Drag;//拖拽中

entry.callback.AddListener(delegate (BaseEventData arg)

{

PointerEventData ped = (PointerEventData)arg;//将基础数据变成鼠标数据

Vector3 newPos;

RectTransformUtility.ScreenPointToWorldPointInRectangle(

btn.GetComponent<RectTransform>(), Mouse.current.position.ReadValue(),//在摄像机视角下鼠标当前坐标转换过去

ped.enterEventCamera, out newPos);

btn.transform.position = newPos;

}

);

et.triggers.Add(entry);

/;

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.EndDrag;//结束拖拽

entry.callback.AddListener(delegate (BaseEventData arg)

{

if (!EventSystem.current.IsPointerOverGameObject())

{

btn.transform.parent = btnParent;

image.raycastTarget = true;

return;

}

PointerEventData ped = (PointerEventData)arg;

Transform target = ped.pointerEnter.transform;

if (target)

{

if (target.tag == obj.GetType().ToString())

{

obj.TakeOn();

//交换装备

ChangeGameObj(target.parent, btn);

//刷新数值

UpdatePlayerValue();

}

else if (target.name == obj.GetType().ToString() || target.name == obj.type)

{

//交换药品

ChangeGameObj(target, btn);

}

else

{

obj.isTakeOn = false;

btn.transform.parent = btnParent;

}

}

image.raycastTarget = true;

}

);

et.triggers.Add(entry);

/

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.PointerClick;//拖拽中

entry.callback.AddListener(delegate (BaseEventData arg)

{

if (btn.tag != ObjType.Drug.ToString())

{

return;

}

//MainGame.player.UseDrugObj(btn.transform);

}

);

et.triggers.Add(entry);

}

//刷新玩家数据

public void UpdatePlayerValue()

{

textHp.text = "生命:" + MainGame.player.Hp + "/" + MainGame.player.HpMax;

textMp.text = "魔力:" + MainGame.player.Mp + "/" + MainGame.player.MpMax;

textAtt.text = "攻击:" + MainGame.player.Att;

textDef.text = "防御:" + MainGame.player.Def;

textMdf.text = "魔抗:" + MainGame.player.Mdf;

textSpd.text = "速度:" + MainGame.player.Spd;

textLv.text = "等级:" + MainGame.player.lv;

textExp.text = "经验:" + MainGame.player.Exp;

}

void ChangeGameObj(Transform target, GameObject btn)

{

GameObj temp = new GameObj();

if (target.childCount >= 2)

{

temp = GameManager.GetGameObj(target.GetChild(0).name);

SetBtnTakeOff(target.GetChild(0), temp);

}

btn.transform.parent = target.transform;

btn.transform.SetAsFirstSibling();

btn.transform.localPosition = Vector3.zero;

btn.GetComponent<RectTransform>().sizeDelta = target.GetComponent<RectTransform>().sizeDelta;

temp = GameManager.GetGameObj(btn.name);

if (temp != null)

{

temp.isTakeOn = true;

}

}

void SetBtnTakeOff(Transform btn, GameObj obj)

{

if (obj != null)

{

btn.parent = btnParent;

obj.isTakeOn = false;

btn.GetComponent<Image>().raycastTarget = true;

}

}

}

新增BagPanel代码:

public override void UpdateValue()

{

ClearBtn(btnParent);

//暂时写不了,需要新增MyPlayer代码的函数

}

新增MyPlayer代码:

添加一个方法

修改MyPlayer代码,利用xml文档的函数添加两个道具

using System;

using System.Collections;

using System.Collections.Generic;

using Unity.VisualScripting;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.InputSystem;

using UnityEngine.UI;

public class MyPlayer : People

{

Header("=================子类变量=================")

public Transform toolPanel;//道具面板

public Transform skillPanel;//技能面板

public BagPanel bag;//包

CharacterController contro;

Controls action;

float rvalue;

float spdFast = 1;

bool isHold;//握住刀

GameObject sword;

GameObject swordBack;

public Image imageHp;

public Image imageMp;

//bagTools = 背包工具

Dictionary<GameObj, int> bagTools = new Dictionary<GameObj, int>();

Dictionary<EquipType, Equip> equips = new Dictionary<EquipType, Equip>();

void Start()

{

//base.Start();

InitValue();

InitSkill();

//获取自身角色控制器

contro = GetComponent<CharacterController>();

SetInput();

sword = transform.Find("Sword_Hand").gameObject;

swordBack = transform.Find("Sword_Back").gameObject;

bag.InitText();

// AddTool(GameManager.GetGameObj("大还丹"), 5);

//3.5.7.6是xml文档里的道具(数字是编号)

//作用是利用xml文档里添加两个道具

AddTool(GameManager.GetGameObj(3), 5);

AddTool(GameManager.GetGameObj(7), 6);

}

void Update()

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Ctrl();

UpdateSkillTime();

}

void SetInput()

{

action = new Controls();

action.Enable();

action.MyCtrl.Move.started += Move;

action.MyCtrl.Move.performed += Move;

action.MyCtrl.Move.canceled += StopMove;

action.MyCtrl.Jump.started += Jump;

action.MyCtrl.Rotate.started += Rotate;

action.MyCtrl.Rotate.performed += Rotate;

action.MyCtrl.Fast.started += FastSpeed;

action.MyCtrl.Fast.performed += FastSpeed;

action.MyCtrl.Fast.canceled += FastSpeed;

action.MyCtrl.GetTool.started += ClickNpcAndTool;

action.MyCtrl.HoldRotate.performed += Hold;

action.MyCtrl.HoldRotate.canceled += Hold;

action.MyAtt.Att.started += Attack;

action.MyAtt.SwordOut.started += SwordOut;

action.Skill.F1.started += SkillAtt;

action.Skill.F2.started += SkillAtt;

action.Skill.F3.started += SkillAtt;

action.Skill.F4.started += SkillAtt;

action.Skill.F5.started += SkillAtt;

action.Skill.F6.started += SkillAtt;

// action.Tools._1.started += GetkeyClick;

// action.Tools._2.started += GetkeyClick;

// action.Tools._3.started += GetkeyClick;

// action.Tools._4.started += GetkeyClick;

//action.Tools._5.started += GetkeyClick;

//action.Tools._6.started += GetkeyClick;

//action.Tools._7.started += GetkeyClick;

//action.Tools._8.started += GetkeyClick;

}

private void GetkeyClick(InputAction.CallbackContext context)

{

string[] str = context.control.ToString().Split('/');

int num = int.Parse(str[2]) - 1;

// UseObj(num);

}

private void SwordOut(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetBool("SwordOut", !Anim.GetBool("SwordOut"));

}

#region 攻击

void SetSwordVisible(int n)

{

sword.SetActive(n != 0);

swordBack.SetActive(n == 0);

}

private void Attack(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (EventSystem.current.IsPointerOverGameObject())

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

Anim.SetInteger("Att", 1);

Anim.SetTrigger("AttTrigger");

}

else

{

int num = Anim.GetInteger("Att");

if (num == 6)

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Light_Attk_" + num))

{

Anim.SetInteger("Att", num + 1);

}

}

}

public void PlayerAttack(string hurt)

{

Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,

attPoint.rotation, LayerMask.GetMask("Enemy"));

if (cs.Length <= 0)

{

return;

}

int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);

foreach (Collider c in cs)

{

print(value);

}

}

public void PlayerAttackHard(string hurt)

{

Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,

attPoint.rotation, LayerMask.GetMask("Enemy"));

if (cs.Length <= 0)

{

return;

}

int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);

foreach (Collider c in cs)

{

print(value);

print("让敌人播放击倒特效");

}

}

#endregion

#region 人物控制

void Ctrl()

{

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle")

|| Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

float f = action.MyCtrl.Move.ReadValue<float>();

contro.Move(transform.forward * f * Time.deltaTime * spdFast * Spd);

contro.Move(transform.up * -9.8f * Time.deltaTime);

if (isHold)

{

transform.Rotate(transform.up * rvalue * 0.3f);

}

}

}

private void Hold(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (context.phase == InputActionPhase.Canceled)

{

isHold = false;

}

else

{

isHold = true;

}

}

private void ClickNpcAndTool(InputAction.CallbackContext context)

{

//throw new NotImplementedException();

}

private void FastSpeed(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace"))

{

if (context.phase == InputActionPhase.Canceled)

{

spdFast = 1;

}

else

{

spdFast = 2;

}

}

}

private void Rotate(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

rvalue = context.ReadValue<float>();

}

private void Jump(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetTrigger("Jump");

}

private void StopMove(InputAction.CallbackContext context)

{

Anim.SetBool("IsRun", false);

}

private void Move(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetBool("IsRun", true);

}

#endregion

#region 技能

protected override void InitSkill()

{

SphereSkill thunderBombCut = new SphereSkill(this, "雷爆斩", SkillType.Magic, 3, Att * 10, -100, 20, 0.3f, 0);

skills.Add(1, thunderBombCut);

SphereSkill windCircleCut = new SphereSkill(this, "旋风斩", SkillType.Physics, 3, Att * 8, -50, 20, 0.2f, 0);

skills.Add(2, windCircleCut);

StraightSkill thunderLightCut = new StraightSkill(this, "雷光斩", SkillType.Physics, 7, 0.5f, Att * 7, -50, 20, 0.2f, 0);

skills.Add(3, thunderLightCut);

SphereSkill oneCut = new SphereSkill(this, "归一斩", SkillType.Physics, 7, Att * 7, -30, 8, 0.2f, 0);

skills.Add(4, oneCut);

StraightSkill crossCut = new StraightSkill(this, "十字斩", SkillType.Physics, 25, 0.5f, Att * 3, -40, 20, 0.2f, 0);

skills.Add(5, crossCut);

SphereSkill thunderLargeCut = new SphereSkill(this, "轰雷斩", SkillType.Magic, 7, Att * 15, -120, 25, 0.35f, 0);

skills.Add(6, thunderLargeCut);

}

private void SkillAtt(InputAction.CallbackContext context)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

string[] str = context.control.ToString().Split('/');

int num = int.Parse(str[2][1].ToString());

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

public void SkillClick(int num)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

void UpdateSkillTime()

{

for (int i = 0; i < skillPanel.childCount; i++)

{

if (skills[i + 1].IsRelease)

{

continue;

}

Image image = skillPanel.GetChild(i).GetChild(0).GetComponent<Image>();

image.fillAmount = skills[i + 1].GetFillTime();

}

}

#endregion

protected override void UpdateUI()

{

PlayerPanel.UpdateHpUI(GetHpRation(), (float)Mp/MpMax);

}

#region 物品道具

public Dictionary<GameObj, int> GetTools()

{

return bagTools;

}

public void AddTool(GameObj gObj, int num)

{

if (gObj == null)

{

return;

}

GameObj temp = GameManager.GetGameObj(gObj.oname);

if (bagTools.ContainsKey(temp))

{

bagTools[temp] += num;

}

else

{

// bagTools[temp] = num;

bagTools.Add(gObj, num);

}

bag.UpdateValue();

}

//public void UseDrugObj(Transform t)

//{

// GameObj obj = GameManager.GetGameObj(t.name);

// obj.UseObjValue();

// bag.UpdatePlayerValue();

// bagTools[obj]--;

// t.GetComponentInChildren<Text>().text = bagTools[obj].ToString();

// if (bagTools[obj] == 0)

// {

// bagTools.Remove(obj);

// Destroy(t.gameObject);

// }

//}

//private void UseObj(int num)

//{

// Transform temp = toolPanel.GetChild(num);

// if (temp.childCount < 2)

// {

// return;

// }

// Transform t = temp.GetChild(0);

// UseDrugObj(t);

//}

#endregion

}

再次修改BagPanel代码:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.InputSystem;

using UnityEngine.UI;

public class BagPanel : UIBase{

Transform canvas;

Transform bagTran;

Transform equipTran;

Button btnTakeOff;

Text textHp;

Text textMp;

Text textLv;

Text textExp;

Text textAtt;

Text textDef;

Text textSpd;

Text textMdf;

void Start(){

InitText();

btnTakeOff = GameManager.FindType<Button>(equipTran, "BtnTakeOff");

btnTakeOff.onClick.AddListener(delegate

{

foreach (Transform item in equipTran.Find("Eq"))

{

if (item.childCount >= 2)

{

GameObj temp = GameManager.GetGameObj(item.GetChild(0).name);

temp.TakeOff();

UpdatePlayerValue();

SetBtnTakeOff(item.GetChild(0), temp);

}

}

});

tween = bagTran.GetComponent<UITween>();

tween.AddEventStartHandle(UpdateValue);

btnBack = GameManager.FindType<Button>(bagTran, "BtnX");

btnBack.onClick.AddListener(delegate

{

tween.UIBack();

equipTran.GetComponent<UITween>().UIBack();

});

}

public override void UpdateValue()

{

ClearBtn(btnParent);

Dictionary<GameObj, int>.KeyCollection keys = MainGame.player.GetTools().Keys;

foreach (GameObj item in keys)

{

if (item.isTakeOn)

{

continue;

}

GameObject btn = Instantiate(prefab, btnParent);

btn.GetComponent<Image>().sprite = LoadManager.LoadSprite("Obj/" + item.oname);

btn.name = item.oname;

btn.tag = item.GetType().ToString();

btn.GetComponentInChildren<Text>().text = MainGame.player.GetTools()[item].ToString();

AddEvent(item, btn);

}

}

public void InitText(){

canvas = MainGame.canvas;

bagTran = transform.Find("Bag");

equipTran = transform.Find("Equip");

text = GameManager.FindType<Text>(bagTran, "TextGold");

Transform temp = equipTran.Find("TextParent");

textHp = GameManager.FindType<Text>(temp, "TextHp");

textMp = GameManager.FindType<Text>(temp, "TextMp");

textLv = GameManager.FindType<Text>(temp, "TextLv");

textExp = GameManager.FindType<Text>(temp, "TextExp");

textAtt = GameManager.FindType<Text>(temp, "TextAtt");

textDef = GameManager.FindType<Text>(temp, "TextDef");

textSpd = GameManager.FindType<Text>(temp, "TextSpd");

textMdf = GameManager.FindType<Text>(temp, "TextMdf");

}

void AddEvent(GameObj obj, GameObject btn)

{

Image image = btn.GetComponent<Image>();

EventTrigger et = btn.GetComponent<EventTrigger>();

if (!et)

{

et = btn.AddComponent<EventTrigger>();

}

EventTrigger.Entry entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.BeginDrag;//开始拖拽

entry.callback.AddListener(delegate

{

image.raycastTarget = false;

btn.transform.SetParent(canvas);

}

);

et.triggers.Add(entry);

//

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.Drag;//拖拽中

entry.callback.AddListener(delegate (BaseEventData arg)

{

PointerEventData ped = (PointerEventData)arg;//将基础数据变成鼠标数据

Vector3 newPos;

RectTransformUtility.ScreenPointToWorldPointInRectangle(

btn.GetComponent<RectTransform>(), Mouse.current.position.ReadValue(),//在摄像机视角下鼠标当前坐标转换过去

ped.enterEventCamera, out newPos);

btn.transform.position = newPos;

}

);

et.triggers.Add(entry);

/;

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.EndDrag;//结束拖拽

entry.callback.AddListener(delegate (BaseEventData arg)

{

if (!EventSystem.current.IsPointerOverGameObject())

{

btn.transform.parent = btnParent;

image.raycastTarget = true;

return;

}

PointerEventData ped = (PointerEventData)arg;

Transform target = ped.pointerEnter.transform;

if (target)

{

if (target.tag == obj.GetType().ToString())

{

obj.TakeOn();

//交换装备

ChangeGameObj(target.parent, btn);

//刷新数值

UpdatePlayerValue();

}

else if (target.name == obj.GetType().ToString() || target.name == obj.type)

{

//交换药品

ChangeGameObj(target, btn);

}

else

{

obj.isTakeOn = false;

btn.transform.parent = btnParent;

}

}

image.raycastTarget = true;

}

);

et.triggers.Add(entry);

/

entry = new EventTrigger.Entry();

entry.eventID = EventTriggerType.PointerClick;//拖拽中

entry.callback.AddListener(delegate (BaseEventData arg)

{

if (btn.tag != ObjType.Drug.ToString())

{

return;

}

//MainGame.player.UseDrugObj(btn.transform);

}

);

et.triggers.Add(entry);

}

//刷新玩家数据

public void UpdatePlayerValue()

{

textHp.text = "生命:" + MainGame.player.Hp + "/" + MainGame.player.HpMax;

textMp.text = "魔力:" + MainGame.player.Mp + "/" + MainGame.player.MpMax;

textAtt.text = "攻击:" + MainGame.player.Att;

textDef.text = "防御:" + MainGame.player.Def;

textMdf.text = "魔抗:" + MainGame.player.Mdf;

textSpd.text = "速度:" + MainGame.player.Spd;

textLv.text = "等级:" + MainGame.player.lv;

textExp.text = "经验:" + MainGame.player.Exp;

}

void ChangeGameObj(Transform target, GameObject btn)

{

GameObj temp = new GameObj();

if (target.childCount >= 2)

{

temp = GameManager.GetGameObj(target.GetChild(0).name);

SetBtnTakeOff(target.GetChild(0), temp);

}

btn.transform.parent = target.transform;

btn.transform.SetAsFirstSibling();

btn.transform.localPosition = Vector3.zero;

btn.GetComponent<RectTransform>().sizeDelta = target.GetComponent<RectTransform>().sizeDelta;

temp = GameManager.GetGameObj(btn.name);

if (temp != null)

{

temp.isTakeOn = true;

}

}

void SetBtnTakeOff(Transform btn, GameObj obj)

{

if (obj != null)

{

btn.parent = btnParent;

obj.isTakeOn = false;

btn.GetComponent<Image>().raycastTarget = true;

}

}

}

挂载脚本

将content拖拽

修改unity场景中TxtParent为TextParent

拖拽Text预制体

添加图片作为一件脱装备,设置正常尺寸

修改Button名为BtnTakeOff

将UITween代码分别挂载在Bag和Equip上

拖拽背包面板BagPanel

添加标签

拖拽

增加两个页面的偏移值

修改MyPlayer代码:

using System;

using System.Collections;

using System.Collections.Generic;

using Unity.VisualScripting;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.InputSystem;

using UnityEngine.UI;

public class MyPlayer : People

{

Header("=================子类变量=================")

public Transform toolPanel;//道具面板

public Transform skillPanel;//技能面板

public BagPanel bag;//包

CharacterController contro;

Controls action;

float rvalue;

float spdFast = 1;

bool isHold;//握住刀

GameObject sword;

GameObject swordBack;

public Image imageHp;

public Image imageMp;

//bagTools = 背包工具

Dictionary<GameObj, int> bagTools = new Dictionary<GameObj, int>();

Dictionary<EquipType, Equip> equips = new Dictionary<EquipType, Equip>();

void Start()

{

//base.Start();

InitValue();

InitSkill();

//获取自身角色控制器

contro = GetComponent<CharacterController>();

SetInput();

sword = transform.Find("Sword_Hand").gameObject;

swordBack = transform.Find("Sword_Back").gameObject;

bag.InitText();

// AddTool(GameManager.GetGameObj("大还丹"), 5);

//3.5.7.6是xml文档里的道具(数字是编号)

//作用是利用xml文档里添加两个道具

AddTool(GameManager.GetGameObj(3), 5);

AddTool(GameManager.GetGameObj(7), 6);

}

void Update()

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Ctrl();

UpdateSkillTime();

}

void SetInput()

{

action = new Controls();

action.Enable();

action.MyCtrl.Move.started += Move;

action.MyCtrl.Move.performed += Move;

action.MyCtrl.Move.canceled += StopMove;

action.MyCtrl.Jump.started += Jump;

action.MyCtrl.Rotate.started += Rotate;

action.MyCtrl.Rotate.performed += Rotate;

action.MyCtrl.Fast.started += FastSpeed;

action.MyCtrl.Fast.performed += FastSpeed;

action.MyCtrl.Fast.canceled += FastSpeed;

action.MyCtrl.GetTool.started += ClickNpcAndTool;

action.MyCtrl.HoldRotate.performed += Hold;

action.MyCtrl.HoldRotate.canceled += Hold;

action.MyAtt.Att.started += Attack;

action.MyAtt.SwordOut.started += SwordOut;

action.Skill.F1.started += SkillAtt;

action.Skill.F2.started += SkillAtt;

action.Skill.F3.started += SkillAtt;

action.Skill.F4.started += SkillAtt;

action.Skill.F5.started += SkillAtt;

action.Skill.F6.started += SkillAtt;

// action.Tools._1.started += GetkeyClick;

// action.Tools._2.started += GetkeyClick;

// action.Tools._3.started += GetkeyClick;

// action.Tools._4.started += GetkeyClick;

//action.Tools._5.started += GetkeyClick;

//action.Tools._6.started += GetkeyClick;

//action.Tools._7.started += GetkeyClick;

//action.Tools._8.started += GetkeyClick;

}

private void GetkeyClick(InputAction.CallbackContext context)

{

string[] str = context.control.ToString().Split('/');

int num = int.Parse(str[2]) - 1;

// UseObj(num);

}

private void SwordOut(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetBool("SwordOut", !Anim.GetBool("SwordOut"));

}

#region 攻击

void SetSwordVisible(int n)

{

sword.SetActive(n != 0);

swordBack.SetActive(n == 0);

}

private void Attack(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (EventSystem.current.IsPointerOverGameObject())

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

Anim.SetInteger("Att", 1);

Anim.SetTrigger("AttTrigger");

}

else

{

int num = Anim.GetInteger("Att");

if (num == 6)

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Light_Attk_" + num))

{

Anim.SetInteger("Att", num + 1);

}

}

}

public void PlayerAttack(string hurt)

{

Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,

attPoint.rotation, LayerMask.GetMask("Enemy"));

if (cs.Length <= 0)

{

return;

}

int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);

foreach (Collider c in cs)

{

print(value);

}

}

public void PlayerAttackHard(string hurt)

{

Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,

attPoint.rotation, LayerMask.GetMask("Enemy"));

if (cs.Length <= 0)

{

return;

}

int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);

foreach (Collider c in cs)

{

print(value);

print("让敌人播放击倒特效");

}

}

#endregion

#region 人物控制

void Ctrl()

{

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle")

|| Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

float f = action.MyCtrl.Move.ReadValue<float>();

contro.Move(transform.forward * f * Time.deltaTime * spdFast * Spd);

contro.Move(transform.up * -9.8f * Time.deltaTime);

if (isHold)

{

transform.Rotate(transform.up * rvalue * 0.3f);

}

}

}

private void Hold(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (context.phase == InputActionPhase.Canceled)

{

isHold = false;

}

else

{

isHold = true;

}

}

private void ClickNpcAndTool(InputAction.CallbackContext context)

{

//throw new NotImplementedException();

}

private void FastSpeed(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace"))

{

if (context.phase == InputActionPhase.Canceled)

{

spdFast = 1;

}

else

{

spdFast = 2;

}

}

}

private void Rotate(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

rvalue = context.ReadValue<float>();

}

private void Jump(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetTrigger("Jump");

}

private void StopMove(InputAction.CallbackContext context)

{

Anim.SetBool("IsRun", false);

}

private void Move(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetBool("IsRun", true);

}

#endregion

#region 技能

protected override void InitSkill()

{

SphereSkill thunderBombCut = new SphereSkill(this, "雷爆斩", SkillType.Magic, 3, Att * 10, -100, 20, 0.3f, 0);

skills.Add(1, thunderBombCut);

SphereSkill windCircleCut = new SphereSkill(this, "旋风斩", SkillType.Physics, 3, Att * 8, -50, 20, 0.2f, 0);

skills.Add(2, windCircleCut);

StraightSkill thunderLightCut = new StraightSkill(this, "雷光斩", SkillType.Physics, 7, 0.5f, Att * 7, -50, 20, 0.2f, 0);

skills.Add(3, thunderLightCut);

SphereSkill oneCut = new SphereSkill(this, "归一斩", SkillType.Physics, 7, Att * 7, -30, 8, 0.2f, 0);

skills.Add(4, oneCut);

StraightSkill crossCut = new StraightSkill(this, "十字斩", SkillType.Physics, 25, 0.5f, Att * 3, -40, 20, 0.2f, 0);

skills.Add(5, crossCut);

SphereSkill thunderLargeCut = new SphereSkill(this, "轰雷斩", SkillType.Magic, 7, Att * 15, -120, 25, 0.35f, 0);

skills.Add(6, thunderLargeCut);

}

private void SkillAtt(InputAction.CallbackContext context)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

string[] str = context.control.ToString().Split('/');

int num = int.Parse(str[2][1].ToString());

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

public void SkillClick(int num)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

void UpdateSkillTime()

{

for (int i = 0; i < skillPanel.childCount; i++)

{

if (skills[i + 1].IsRelease)

{

continue;

}

Image image = skillPanel.GetChild(i).GetChild(0).GetComponent<Image>();

image.fillAmount = skills[i + 1].GetFillTime();

}

}

#endregion

protected override void UpdateUI()

{

PlayerPanel.UpdateHpUI(GetHpRation(), (float)Mp/MpMax);

}

#region 物品道具

public Dictionary<GameObj, int> GetTools()

{

return bagTools;

}

public void AddTool(GameObj gObj, int num)

{

if (gObj == null)

{

return;

}

GameObj temp = GameManager.GetGameObj(gObj.oname);

if (bagTools.ContainsKey(temp))

{

bagTools[temp] += num;

}

else

{

//相同作用

//bagTools[temp] = num;

bagTools.Add(gObj, num);

}

bag.UpdateValue();

}

public void UseDrugObj(Transform t)

{

GameObj obj = GameManager.GetGameObj(t.name);

obj.UseObjValue();

bag.UpdatePlayerValue();

bagTools[obj]--;

t.GetComponentInChildren<Text>().text = bagTools[obj].ToString();

if (bagTools[obj] == 0)

{

bagTools.Remove(obj);

Destroy(t.gameObject);

}

}

private void UseObj(int num)

{

Transform temp = toolPanel.GetChild(num);

if (temp.childCount < 2)

{

return;

}

Transform t = temp.GetChild(0);

UseDrugObj(t);

}

#endregion

}

接下来需要做下侧道具栏的层级显示

/

即可实现拖拽物品道具

放置相同位置也可以交换

新建新输入系统文件夹Tools

修改MyPlayer代码:

using System;

using System.Collections;

using System.Collections.Generic;

using Unity.VisualScripting;

using UnityEngine;

using UnityEngine.EventSystems;

using UnityEngine.InputSystem;

using UnityEngine.UI;

public class MyPlayer : People

{

Header("=================子类变量=================")

public Transform toolPanel;//道具面板

public Transform skillPanel;//技能面板

public BagPanel bag;//包

CharacterController contro;

Controls action;

float rvalue;

float spdFast = 1;

bool isHold;//握住刀

GameObject sword;

GameObject swordBack;

public Image imageHp;

public Image imageMp;

//bagTools = 背包工具

Dictionary<GameObj, int> bagTools = new Dictionary<GameObj, int>();

Dictionary<EquipType, Equip> equips = new Dictionary<EquipType, Equip>();

void Start()

{

//base.Start();

InitValue();

InitSkill();

//获取自身角色控制器

contro = GetComponent<CharacterController>();

SetInput();

sword = transform.Find("Sword_Hand").gameObject;

swordBack = transform.Find("Sword_Back").gameObject;

bag.InitText();

// AddTool(GameManager.GetGameObj("大还丹"), 5);

//3.5.7.6是xml文档里的道具(数字是编号)

//作用是利用xml文档里添加两个道具

AddTool(GameManager.GetGameObj(3), 5);

AddTool(GameManager.GetGameObj(7), 6);

}

void Update()

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Ctrl();

UpdateSkillTime();

}

void SetInput()

{

action = new Controls();

action.Enable();

action.MyCtrl.Move.started += Move;

action.MyCtrl.Move.performed += Move;

action.MyCtrl.Move.canceled += StopMove;

action.MyCtrl.Jump.started += Jump;

action.MyCtrl.Rotate.started += Rotate;

action.MyCtrl.Rotate.performed += Rotate;

action.MyCtrl.Fast.started += FastSpeed;

action.MyCtrl.Fast.performed += FastSpeed;

action.MyCtrl.Fast.canceled += FastSpeed;

action.MyCtrl.GetTool.started += ClickNpcAndTool;

action.MyCtrl.HoldRotate.performed += Hold;

action.MyCtrl.HoldRotate.canceled += Hold;

action.MyAtt.Att.started += Attack;

action.MyAtt.SwordOut.started += SwordOut;

action.Skill.F1.started += SkillAtt;

action.Skill.F2.started += SkillAtt;

action.Skill.F3.started += SkillAtt;

action.Skill.F4.started += SkillAtt;

action.Skill.F5.started += SkillAtt;

action.Skill.F6.started += SkillAtt;

action.Tools._1.started += GetkeyClick;

action.Tools._2.started += GetkeyClick;

action.Tools._3.started += GetkeyClick;

action.Tools._4.started += GetkeyClick;

action.Tools._5.started += GetkeyClick;

action.Tools._6.started += GetkeyClick;

action.Tools._7.started += GetkeyClick;

action.Tools._8.started += GetkeyClick;

}

private void GetkeyClick(InputAction.CallbackContext context)

{

string[] str = context.control.ToString().Split('/');

int num = int.Parse(str[2]) - 1;

UseObj(num);

}

private void SwordOut(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetBool("SwordOut", !Anim.GetBool("SwordOut"));

}

#region 攻击

void SetSwordVisible(int n)

{

sword.SetActive(n != 0);

swordBack.SetActive(n == 0);

}

private void Attack(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (EventSystem.current.IsPointerOverGameObject())

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

Anim.SetInteger("Att", 1);

Anim.SetTrigger("AttTrigger");

}

else

{

int num = Anim.GetInteger("Att");

if (num == 6)

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Light_Attk_" + num))

{

Anim.SetInteger("Att", num + 1);

}

}

}

public void PlayerAttack(string hurt)

{

Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,

attPoint.rotation, LayerMask.GetMask("Enemy"));

if (cs.Length <= 0)

{

return;

}

int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);

foreach (Collider c in cs)

{

print(value);

}

}

public void PlayerAttackHard(string hurt)

{

Collider[] cs = Physics.OverlapBox(attPoint.position, Vector3.one * 0.5f,

attPoint.rotation, LayerMask.GetMask("Enemy"));

if (cs.Length <= 0)

{

return;

}

int value = (int)(Att * Anim.GetInteger("Att") * 0.5f);

foreach (Collider c in cs)

{

print(value);

print("让敌人播放击倒特效");

}

}

#endregion

#region 人物控制

void Ctrl()

{

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle")

|| Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

float f = action.MyCtrl.Move.ReadValue<float>();

contro.Move(transform.forward * f * Time.deltaTime * spdFast * Spd);

contro.Move(transform.up * -9.8f * Time.deltaTime);

if (isHold)

{

transform.Rotate(transform.up * rvalue * 0.3f);

}

}

}

private void Hold(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (context.phase == InputActionPhase.Canceled)

{

isHold = false;

}

else

{

isHold = true;

}

}

private void ClickNpcAndTool(InputAction.CallbackContext context)

{

//throw new NotImplementedException();

}

private void FastSpeed(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

if (Anim.GetCurrentAnimatorStateInfo(0).IsName("Run") || Anim.GetCurrentAnimatorStateInfo(0).IsName("Run_Inplace"))

{

if (context.phase == InputActionPhase.Canceled)

{

spdFast = 1;

}

else

{

spdFast = 2;

}

}

}

private void Rotate(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

rvalue = context.ReadValue<float>();

}

private void Jump(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetTrigger("Jump");

}

private void StopMove(InputAction.CallbackContext context)

{

Anim.SetBool("IsRun", false);

}

private void Move(InputAction.CallbackContext context)

{

if (GameManager.gameState != GameState.Play)

{

return;

}

Anim.SetBool("IsRun", true);

}

#endregion

#region 技能

protected override void InitSkill()

{

SphereSkill thunderBombCut = new SphereSkill(this, "雷爆斩", SkillType.Magic, 3, Att * 10, -100, 20, 0.3f, 0);

skills.Add(1, thunderBombCut);

SphereSkill windCircleCut = new SphereSkill(this, "旋风斩", SkillType.Physics, 3, Att * 8, -50, 20, 0.2f, 0);

skills.Add(2, windCircleCut);

StraightSkill thunderLightCut = new StraightSkill(this, "雷光斩", SkillType.Physics, 7, 0.5f, Att * 7, -50, 20, 0.2f, 0);

skills.Add(3, thunderLightCut);

SphereSkill oneCut = new SphereSkill(this, "归一斩", SkillType.Physics, 7, Att * 7, -30, 8, 0.2f, 0);

skills.Add(4, oneCut);

StraightSkill crossCut = new StraightSkill(this, "十字斩", SkillType.Physics, 25, 0.5f, Att * 3, -40, 20, 0.2f, 0);

skills.Add(5, crossCut);

SphereSkill thunderLargeCut = new SphereSkill(this, "轰雷斩", SkillType.Magic, 7, Att * 15, -120, 25, 0.35f, 0);

skills.Add(6, thunderLargeCut);

}

private void SkillAtt(InputAction.CallbackContext context)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

string[] str = context.control.ToString().Split('/');

int num = int.Parse(str[2][1].ToString());

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

public void SkillClick(int num)

{

if (!Anim.GetCurrentAnimatorStateInfo(0).IsName("Idle_Fight"))

{

return;

}

SkillBase skill = skills[num];

if (!skill.MayRelease())

{

return;

}

Anim.SetTrigger("CSkill" + num);

ReleaseSkill(skill);

}

void UpdateSkillTime()

{

for (int i = 0; i < skillPanel.childCount; i++)

{

if (skills[i + 1].IsRelease)

{

continue;

}

Image image = skillPanel.GetChild(i).GetChild(0).GetComponent<Image>();

image.fillAmount = skills[i + 1].GetFillTime();

}

}

#endregion

protected override void UpdateUI()

{

PlayerPanel.UpdateHpUI(GetHpRation(), (float)Mp/MpMax);

}

#region 物品道具

public Dictionary<GameObj, int> GetTools()

{

return bagTools;

}

public void AddTool(GameObj gObj, int num)

{

if (gObj == null)

{

return;

}

GameObj temp = GameManager.GetGameObj(gObj.oname);

if (bagTools.ContainsKey(temp))

{

bagTools[temp] += num;

}

else

{

//相同作用

//bagTools[temp] = num;

bagTools.Add(gObj, num);

}

bag.UpdateValue();

}

public void UseDrugObj(Transform t)

{

GameObj obj = GameManager.GetGameObj(t.name);

obj.UseObjValue();

bag.UpdatePlayerValue();

bagTools[obj]--;

t.GetComponentInChildren<Text>().text = bagTools[obj].ToString();

if (bagTools[obj] == 0)

{

bagTools.Remove(obj);

Destroy(t.gameObject);

}

}

private void UseObj(int num)

{

Transform temp = toolPanel.GetChild(num);

if (temp.childCount < 2)

{

return;

}

Transform t = temp.GetChild(0);

UseDrugObj(t);

}

#endregion

}

找到关闭Bag按钮

实现点击背包x关闭

相关推荐
界面开发小八哥1 小时前
界面开发框架DevExpress XAF实践:集成.NET Aspire后如何实现数据库依赖?
ui·.net·界面控件·devexpress·ui开发·xaf
Humbunklung19 小时前
Rust Floem UI 框架使用简介
开发语言·ui·rust
CodeCraft Studio1 天前
【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台
javascript·物联网·ui
插件开发1 天前
免费插件集-illustrator插件-Ai插件-随机填色
ui·illustrator
叹一曲当时只道是寻常2 天前
AI书签管理工具开发全记录(十三):TUI基本框架搭建
ui·go
海尔辛2 天前
Unity UI 性能优化--Sprite 篇
ui·unity·性能优化
QQ676580083 天前
基于 PyTorch 的 VGG16 深度学习人脸识别检测系统的实现+ui界面
人工智能·pytorch·python·深度学习·ui·人脸识别
pop_xiaoli3 天前
UI学习—cell的复用和自定义cell
学习·ui·ios
测试老哥4 天前
Pytest+Selenium UI自动化测试实战实例
自动化测试·软件测试·python·selenium·测试工具·ui·pytest
步、步、为营4 天前
.net jwt实现
ui·.net