0


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关闭

标签: ui

本文转载自: https://blog.csdn.net/weixin_69360830/article/details/134794313
版权归原作者 __water 所有, 如有侵权,请联系我们删除。

“RPG项目01_UI面板Game”的评论:

还没有评论