导入Xml文档,
<?xml version="1.0" encoding="UTF-8"?>
<Root>
? <TalkInfo>
? ? <Item Idx="0" Title="见到公子" Msg="我叫粘贴,我们村叫粘家村,是这个村子的护卫,最近村子附近有倭寇出没,请勇士出手相助!_驱逐倭寇,责无旁贷!他们的位置在哪?_他们在城堡南面_等我的好消息吧!" FHead="2" SHead="1" Money="0" Objs="" Mission="0" />
? ? <Item Idx="1" Title="收取报酬" Msg="那帮倭寇已经被我干掉了!_感谢壮士,请问勇士尊姓大名?_在下爽!爽啊!_感谢爽壮士,这有黄金200两,请笑纳!_哈哈哈哈,这多不好意思啊!能再多点吗?" FHead="1" SHead="2" Money="200" Objs="" Mission="-1"/>
? ? <Item Idx="2" Title="见到爽" Msg="爽壮士,这段时间村子里有狼人出没。有很多人被狼人杀害了,就在昨天村东头的闲汉刘兴浩,就被狼人刀了。_放心吧,我是预言家,我能查出谁是狼人!_那就谢谢爽壮士了_不用客气,把钱准备好就行!!!" FHead="2" SHead="1" ?Money="0" Objs="" Mission="1"/>
? ? <Item Idx="3" Title="感谢爽" Msg="狼人已经被我杀了!_爽壮士果然厉害!_哈哈哈,没说的,钱呢?_钱本来已经准备好了,但是昨天来了一个叫冯圣的女巫,把钱抢跑了!_敢抢我爽的钱,丫是不想活了,她现在在哪里?_她抢完钱就跑了,不知道跑到哪里去了!" FHead="1" SHead="2" Money="0" Objs="" Mission="2"/>
? </TalkInfo>
? <MissionInfo>
? ? <Item Idx="0" Title="消灭倭寇!" Msg="找到并消灭城堡南面的倭寇!" Exp="200" Money="330" Objs="幽华剑_幽华剑" TargetEnemy="TargetJapan" Mission="1"/>
? ? <Item Idx="1" Title="消灭狼人!" Msg="找到狼人,并消灭它。" Exp="200" Money="430" Objs="浮光剑_金丝甲" TargetEnemy="TargetWolf" Mission="-1"/>
? ? <Item Idx="2" Title="抢回黄金!" Msg="找到冯圣,夺回被抢走的黄金。" Exp="200" Money="500" Objs="腾云靴" TargetEnemy="" Mission="-1"/>
? </MissionInfo>
? <DrugInfo>
? ? <Item Idx="0" Name="大还丹" Type="Hp" Hp="100" Mp="0" ?Msg="初级丹药"/>
? ? <Item Idx="1" Name="金光丹" Type="Hp" Hp="200" Mp="0" ?Msg="中级丹药" />
? ? <Item Idx="2" Name="碧霞丹" Type="Hp" Hp="500" Mp="0" ?Msg="0"/>
? ? <Item Idx="3" Name="幽云丹" Type="Hp" Hp="1000" Mp="0" ?Msg="0"/>
? ? <Item Idx="4" Name="还魂丹" Type="Hp" Hp="2000" Mp="0" ?Msg="0"/>
? ? <Item Idx="5" Name="人参" Type="Mp" Hp="0" Mp="100" ?Msg="0"/>
? ? <Item Idx="6" Name="灵芝" Type="Mp" Hp="0" Mp="200" ?Msg="0"/>
? ? <Item Idx="7" Name="育神花" Type="Mp" Hp="0" Mp="500" ?Msg="0"/>
? ? <Item Idx="8" Name="流光草" Type="Mp" Hp="0" Mp="1000" ?Msg="0"/>
? ? <Item Idx="9" Name="圣心丹" Type="Mp" Hp="0" Mp="2000" ?Msg="0"/>
? </DrugInfo>
? <EquipInfo>
? ? <Item Idx="10" Name="青锋剑" Type="Weapon" Att="5" Def="0" Mdf="0" ?Spd="0" Msg="0"/>
? ? <Item Idx="11" Name="幽华剑" Type="Weapon" Att="10" Def="0" Mdf="0" ?Spd="0" Msg="0"/>
? ? <Item Idx="12" Name="寒霜剑" Type="Weapon" Att="20" Def="0" Mdf="0" ?Spd="0" Msg="0"/>
? ? <Item Idx="13" Name="浮光剑" Type="Weapon" Att="30" Def="0" Mdf="0" ?Spd="0" Msg="0"/>
? ? <Item Idx="14" Name="天一剑" Type="Weapon" Att="50" Def="0" Mdf="0" ?Spd="0" Msg="0"/>
? ? <Item Idx="15" Name="皮甲" Type="Armor" Att="0" Def="0" Mdf="5" ?Spd="0" Msg="0"/>
? ? <Item Idx="16" Name="青铜甲" Type="Armor" Att="0" Def="0" Mdf="10" ?Spd="0" Msg="0"/>
? ? <Item Idx="17" Name="细纹甲" Type="Armor" Att="0" Def="0" Mdf="20" ?Spd="0" Msg="0"/>
? ? <Item Idx="18" Name="金丝甲" Type="Armor" Att="0" Def="0" Mdf="30" ?Spd="0" Msg="0"/>
? ? <Item Idx="19" Name="圣光甲" Type="Armor" Att="0" Def="0" Mdf="50" ?Spd="0" Msg="0"/>
? ? <Item Idx="20" Name="战盔" Type="Helmet" Att="1" Def="1" Mdf="1" ?Spd="0" Msg="精铁打造,威风凛凛。"/>
? ? <Item Idx="21" Name="朝天冠" Type="Helmet" Att="3" Def="3" Mdf="3" ?Spd="0" Msg="此冠是著名锻造大师粘公子生前得意制作,坚固无比且冬凉夏暖无比销魂,带上它保你欲仙欲死!!!"/>
? ? <Item Idx="22" Name="紫玉冠" Type="Helmet" Att="5" Def="5" Mdf="5" ?Spd="0" Msg="头盔正中镶嵌一个赤色宝玉,有提神醒脑之功效。"/>
? ? <Item Idx="23" Name="杀神盔" Type="Helmet" Att="10" Def="10" Mdf="10" ?Spd="0" Msg="相传是战国杀神白起所用之盔 ,盔内蕴藏着白起的魂魄!"/>
? ? <Item Idx="24" Name="紫电盔" Type="Helmet" Att="20" Def="20" Mdf="20" ?Spd="0" Msg="传说是盘古开天之时,混沌初开,空中闪电肆虐,盘古大展神通将闪电能量化作这个紫电盔!"/>
? ? <Item Idx="25" Name="棉靴" Type="Boots" Att="0" Def="0" Mdf="0" ?Spd="2" Msg="采用新疆上等棉花制作,保暖透气,轻便舒适。"/>
? ? <Item Idx="26" Name="青云履" Type="Boots" Att="0" Def="0" Mdf="0" ?Spd="4" Msg="附带轻身特性,穿上它使人身轻如燕。"/>
? ? <Item Idx="27" Name="腾云靴" Type="Boots" Att="0" Def="0" Mdf="0" ?Spd="6" Msg="足踏此靴,有腾云驾雾之感。"/>
? ? <Item Idx="28" Name="掠影靴" Type="Boots" Att="0" Def="0" Mdf="0" ?Spd="8" Msg="浮光掠影,岂是一个快字了得!出自锻造大师粘公子之手。"/>
? ? <Item Idx="29" Name="登天履" Type="Boots" Att="0" Def="0" Mdf="0" ?Spd="20" Msg="一步登天,不过如此!"/>
? ? <Item Idx="30" Name="木盾" Type="Shield" Att="0" Def="5" Mdf="0" ?Spd="0" Msg="木制简盾。"/>
? ? <Item Idx="31" Name="金刚盾" Type="Shield" Att="0" Def="10" Mdf="0" ?Spd="0" Msg="不动金刚,立地为盾!"/>
? ? <Item Idx="32" Name="蓝晶盾" Type="Shield" Att="0" Def="20" Mdf="0" ?Spd="0" Msg="采用稀有蓝晶矿石做成的盾,防御力超强!"/>
? ? <Item Idx="33" Name="四象盾" Type="Shield" Att="0" Def="30" Mdf="0" ?Spd="0" Msg="传说集合上古四象之力做成的巨盾!"/>
? ? <Item Idx="34" Name="蚩尤盾" Type="Shield" Att="0" Def="50" Mdf="0" ?Spd="0" Msg="传说盾牌之内融合这上古魔神蚩尤的魂魄!"/>
? </EquipInfo>
</Root>
在文件夹的Manager下新建脚本LoadManager,
双击LoadManager.cs修改代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LoadManager?
{
? ? public static AudioClip LoadAudio(string str) {
? ? ? ? AudioClip clip = Resources.Load<AudioClip>("Audio/" + str);
? ? ? ? return clip;
? ? }
? ? public static GameObject LoadGameObject(string str)
? ? {
? ? ? ? GameObject obj = Resources.Load<GameObject>("Prefab/" + str);
? ? ? ? return obj;
? ? }
? ? public static Sprite LoadSprite(string str)
? ? {
? ? ? ? Sprite sprite = Resources.Load<Sprite>("Pic/" + str);
? ? ? ? return sprite;
? ? }
? ? public static TextAsset LoadXml(string str)
? ? {
? ? ? ? TextAsset t = Resources.Load<TextAsset>("Xml/" + str);
? ? ? ? return t;
? ? }
}
在Manager文件夹下创建脚本GameManager,
双击GameManager.cs修改代码:
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 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);
? ? }
}
在Manager文件夹下创建脚本MainGame,
双击MainGame.cs修改代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MainGame : MonoBehaviour
{
? ? public static Transform canvas;
? ? private void Awake()
? ? {
? ? ? ? GameManager.Init();
? ? ? ? canvas = transform;
? ? }
}
再在Scripts脚本文件夹下新建文件夹命名为:Living(活着的生物),
在Living创建基类People,
双击People.cs修改代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class People : MonoBehaviour{
? ??
}
再创建两个子类MyPlayer,
双击MyPlayer.cs修改代码:
第二个子类,
双击Enemy.cs修改代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Enemy : People
{
? ??
}
重新修改MainGame代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MainGame : MonoBehaviour
{
? ? public static Transform canvas;
? ? public static MyPlayer player;
? ? private void Awake()
? ? {
? ? ? ? GameManager.Init();
? ? ? ? player = GameObject.Find("Player").GetComponent<MyPlayer>(); ? ?
? ? ? ? canvas = transform;
? ? }
}
接下来挂载脚本:
新建脚本文件夹Data,
新建脚本DataObject,
写代码(数据类:为角色提供数据):
将DataObject脚本挂载到Player人物上,
在脚本文件夹下创建SkillBase文件夹,
新建SkillBase.cs
双击SkillBase.cs修改脚本:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
public enum SkillType { Up, Magic, Physics };
public class SkillBase : MonoBehaviour
{
? ??
}
修改People代码:
using System.Collections.Generic;
using UnityEngine;
public class People : MonoBehaviour{
????//等价知识点:1 = 2
????//1.public int Num { get; }
????//------------------------------
????//2.int num;
????// ?public int Num(){
????// ?????return num;
????// ?}
????public DataObject data;
? ? public int Hp{
? ? ? ? protected set{ data.hp = value; }
? ? ? ? get{ return Mathf.Clamp(data.hp, 0, HpMax); }
? ? }
? ? public int HpMax{
? ? ? ? protected set{ data.hpMax = value; }
? ? ? ? get{ return data.hpMax + OffsetHp; }
? ? }
? ? public int Mp{
? ? ? ? protected set{ data.mp = value; }
? ? ? ? get{ return Mathf.Clamp(data.mp, 0, MpMax); }
? ? }
? ? public int MpMax{
? ? ? ? protected set{ data.mpMax = value; }
? ? ? ? get{ return data.mpMax + OffsetMp; }
? ? }
? ? public float Spd{
? ? ? ? protected set{ data.spd = value; }
? ? ? ? get{ return data.spd + OffsetSpd; }
? ? }
? ? public int Att{
? ? ? ? protected set{ data.att = value; }
? ? ? ? get{ return (int)(data.att * GetRandomRate()) + OffsetAtt; }
? ? }
? ? public int Def{
? ? ? ? protected set{ data.def = value; }
? ? ? ? get{ return data.def + OffsetDef; }
? ? }
? ? public int Mdf{
? ? ? ? protected set{ data.mdf = value; }
? ? ? ? get{ return data.mdf + OffsetMdf; }
? ? }
? ? public int lv{
? ? ? ? protected set => data.lv = value;
? ? ? ? get => data.lv;
? ? }
? ? public int Exp { set; get; }
? ? public bool IsDeath { set; get; }
? ? public People Target { get; set; }
? ? public Animator Anim { get; set; }
? ? protected int OffsetHp { set; get; }
? ? protected int OffsetMp { set; get; }
? ? protected int OffsetSpd { set; get; }
? ? protected int OffsetAtt { set; get; }
? ? protected int OffsetDef { set; get; }
? ? protected int OffsetMdf { set; get; }
? ? public Transform attPoint;
? ? public delegate void Fun(People p);
? ? protected event Fun Dead;
? ? protected Dictionary<int, SkillBase> skills = new Dictionary<int, SkillBase>();
????#region 初始化
????protected virtual void InitValue(){
? ? ? ? Anim = GetComponent<Animator>();
? ? ? ? data = GetComponent<DataObject>();
? ? ? ? Dead = Death;
? ? }
? ? protected virtual void InitSkill(){
? ? }
????#endregion
????#region 事件
????public void AddEventHandle(Fun funback){
? ? ? ? Dead += funback;
? ? }
? ? public void RemoveEventHandle(Fun funback){
? ? ? ? Dead -= funback;
? ? }
? ? protected virtual void Death(People p){
? ? ? ? IsDeath = true;
? ? ? ? Anim.SetTrigger("IsDeath");
? ? ? ? p.Victory(this);
? ? ? ? Invoke("Over", 5);
? ? }
? ? protected virtual void Victory(People p){
? ? }
? ? protected void Over(){
? ? ? ? print("over");
? ? }
????#endregion
????#region 战斗伤害
????protected float GetRandomRate(){
? ? ? ? return (Random.Range(-data.randomAtk, data.randomAtk + 1) + 100) * 0.01f;
? ? }
? ? public virtual void BePhysicsHit(int value, People p){
? ? ? ? if (IsDeath)
? ? ? ? ? ? return;
? ? ? ? Hp -= value - Def;
? ? ? ? UpdateUI();
? ? ? ? if (Hp <= 0)
? ? ? ? ? ? Dead(p);
? ? }
? ? public virtual void BeMagicHit(int value, People p){
? ? ? ? if (IsDeath)
? ? ? ? ? ? return;
? ? ? ? Hp -= value - Mdf;
? ? ? ? UpdateUI();
? ? ? ? if (Hp <= 0)
? ? ? ? ? ? Dead(p);
? ? }
????#endregion
????#region Hp/Mp
????public virtual void AddHp(int value){
? ? ? ? Hp += value;
? ? ? ? UpdateUI();
? ? }
? ? public virtual void AddMp(int value){
? ? ? ? Mp += value;
? ? ? ? UpdateUI();
? ? }
? ? public float GetHpRation(){
? ? ? ? return (float)Hp / HpMax;
? ? }
????#endregion
????protected void Start(){
? ? ? ? InitSkill();
? ? ? ? InitValue();
? ? }
? ? protected virtual void UpdateUI(){
? ? }
}
修改MyPlayer脚本代码:
using UnityEngine;
public class MyPlayer : People{
? ? [Header("==============子类变量==============")]
? ? public Transform toolPanel;
? ? new void Start(){
? ? ? ? base.Start();
? ? }
? ? private void Update(){
? ? }
}
在Living脚本文件夹下新建脚本CameraCtrl,
双击CameraCtrl.cs修改代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraCtrl : MonoBehaviour
{
? ? public float dis;
? ? public float height;
? ? public float speed;
? ? Transform target;
? ? Vector3 targetPos;
? ? // Start is called before the first frame update
? ? void Start()
? ? {
? ? ? ? target = MainGame.player.transform;
? ? }
? ? // Update is called once per frame
? ? void Update()
? ? {
? ? ? ? transform.LookAt(target.position + Vector3.up * 1.5f);
? ? ? ? targetPos = target.forward * (-dis) + target.up * height + target.position;
? ? }
? ? private void LateUpdate()
? ? {
? ? ? ? transform.position = Vector3.Lerp(transform.position, targetPos, speed);
? ? }
}
更新MyPlayer代码:
using UnityEngine;
using UnityEngine.UI;
public class MyPlayer : People{
? ? [Header("==============子类变量==============")]
? ? public Transform toolPanel;
? ? public Transform skillPanel;
? ? CharacterController contro;
? ? float rvalue;
? ? float spdFast = 1;
? ? bool isHold;
? ? GameObject sword;
? ? GameObject swordBack;
? ? public Image imageHp;
? ? public Image imageMp;
? ? new void Start(){
? ? ? ? base.Start();
? ? }
? ? void Update(){
? ? }
}
再将CameraCtrl摄像机跟随代码挂载在Camera摄像机上,
调节CameraCtrl数值,
运行即完成,
End.