《游戏-02_3D-开发》之—基础框架与摄像机跟随

导入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.

相关推荐
weixin_464078071 小时前
C#串口温度读取
开发语言·c#
程序员是干活的3 小时前
私家车开车回家过节会发生什么事情
java·开发语言·软件构建·1024程序员节
明耀3 小时前
WPF RadioButton 绑定boolean值
c#·wpf
Death2005 小时前
Qt 中的 QListWidget、QTreeWidget 和 QTableWidget:简化的数据展示控件
c语言·开发语言·c++·qt·c#
Death2006 小时前
Qt 3D、QtQuick、QtQuick 3D 和 QML 的关系
c语言·c++·qt·3d·c#
yufei-coder6 小时前
C#基础语法
开发语言·c#·.net
yngsqq6 小时前
031集——文本文件按空格分行——C#学习笔记
笔记·学习·c#
新手unity自用笔记21 小时前
项目-坦克大战学习-子弹的移动与销毁
笔记·学习·c#
qinzechen1 天前
分享几个做题网站------学习网------工具网;
java·c语言·c++·python·c#
yufei-coder1 天前
C# Windows 窗体开发基础
vscode·microsoft·c#·visual studio