“英雄无敌”(一)
注意:在閱讀本文前建議觀看對應的視頻教程,本文主要作為那些對視頻教程仍有疑問的學習者的參考資料
視頻教程:https://www.bilibili.com/video/BV12s411g7gU?p=136
目錄
敵人模塊
需求分析?
EnemyMotor 敵人馬達類
EnemyStatusInfo 敵人狀態信息類?
EnemyAnimation 敵人動畫類?
敵人生成器
需求分析
EnemySpawn 敵人生成器類?
Path 路線類
敵人模塊
1.敵人沿指定路線運動
2.受擊后減血死亡
3.到達終點攻擊玩家?
4.運動播放跑步動畫,攻擊播放攻擊動畫,攻擊間隔播放閑置動畫,死亡播放死亡動畫
需求分析?
EnemyMotor 敵人馬達類:提供移動、旋轉、尋路功能?
EnemyStatusInfo 敵人狀態信息類:定義血量,提供受傷、死亡的功能
EnemyAnimation 敵人動畫類:定義各種動畫名稱,提供播放動畫的功能
ps:由于沒有相應的游戲素材,故本文使用print(“播放XX動畫”)來代替場景中動畫的部分,其次本文建議創建幾個對應的空動畫以滿足運行條件?
關于動畫的創建及在新版中使用舊版動畫系統的注意事項,請閱讀Unity腳本(三)中關于Animation的內容
EnemyAI 敵人AI類:通過判斷狀態,執行尋路或者攻擊
ps:以上組件均應掛載至敵人的預制體上,但在實際開發中不建議直接將組件構造至模型上,應為其創建一個空物體作為其父級并將組件掛載至該父級上,如下圖
???
EnemyMotor 敵人馬達類
1.定義向前移動的方法?
2.定義朝向目標點旋轉的方法
3.定義尋路的方法
using System.Collections; using System.Collections.Generic; using UnityEngine;//敵人馬達,提供移動、旋轉、尋路功能 public class EnemyMotor : MonoBehaviour {public Path path;//當前路徑點的索引private int currentPointIndex = 0;public float moveSpeed;private void Update(){PathFinding();}//向前移動public void MovementForward(){transform.Translate(0, 0, moveSpeed * Time.deltaTime);}//注視選轉public void LookRotation(Vector3 target){this.transform.LookAt(target);}//尋路,沿路線移動public bool PathFinding(){//return true;繼續尋路//return false;到達終點,無需尋路//如果到達目標點//更新目標點(向下一個點移動)if (path == null || currentPointIndex >= path.wayPoints.Length) return false;//朝向目標點LookRotation(path.wayPoints[currentPointIndex]);//向前移動MovementForward();//如果達到目標(當前位置接近于目標點)if (Vector3.Distance(transform.position, path.wayPoints[currentPointIndex]) < 0.1f){currentPointIndex++;}return true;} }EnemyStatusInfo 敵人狀態信息類?
1.定義變量:當前生命值
2.定義方法:受傷,死亡
using System.Collections; using System.Collections.Generic; using UnityEngine;//敵人狀態信息類,定義敵人信息,提供受傷死亡功能 public class EnemyStatusInfo : MonoBehaviour {public float HP = 200;public float maxHP = 200;//死亡延遲銷毀時間public float deathDelay = 5;public EnemySpawn spawn;//受傷public void Damage(float damage){//扣血HP -= damage;//血量為0時,調用死亡方法if (HP <= 0)Death();}//死亡public void Death(){//播放死亡動畫var anim = GetComponent<EnemyAnimation>();anim.action.Play(anim.deathAnimName);print("播放死亡動畫");//銷毀當前物體 Destroy(gameObject, deathDelay);//設置路線狀態GetComponent<EnemyMotor>().path.isUsable = true;//產生下一個物體spawn.GenerateEnemy();}//測試方法,鼠標點擊敵人,對其造成50點傷害private void OnMouseDown() {Damage(50);} }ps:請務必在敵人的預制體上掛載碰撞組件(Collider),否則OnMouseDown()無法生效
EnemyAnimation 敵人動畫類?
1.定義各種動畫名稱的變量,如跑步、閑置、攻擊
2.定義AnimationAction類,提供有關動畫的行為?
using System.Collections; using System.Collections.Generic; using UnityEngine;public class EnemyAnimation : MonoBehaviour {//跑步動畫名稱public string runAnimName;//攻擊動畫名稱public string attackAnimName;//閑置動畫名稱public string idleAnimaName;//死亡動畫名稱public string deathAnimName;//行為類public AnimationAction action;private void Awake(){//action=new AnimationAction(?);action=new AnimationAction(GetComponent<Animation>());} }AnimationAction 動畫行為類
using System.Collections; using System.Collections.Generic; using UnityEngine;//動畫行為類,提供有關動畫的行為 public class AnimationAction {//附加在敵人模型上的動畫組件引用private Animation anim;//創建動畫行為類public AnimationAction(Animation anim){this.anim=anim;}//播放動畫public void Play(string animName){anim.CrossFade(animName);}public bool IsPlaying(string animName){return anim.IsPlaying(animName);}}敵人生成器
1.開始時生成指定數量的敵人
2.為每人隨機選擇一條可以使用的路線
3.敵人類型、產生的延遲時間隨機
4.當敵人死亡后,再產生下一個敵人,直到生成數量到達上限為止
需求分析
1.創建根路線,并添加多條配有路點的路線
2.EnemySpawn 敵人生成器類:附加到根路線中,提供生成敵人的功能
3.Path 路線類:包括的屬性有,路點坐標Vector3[] wayPoints,是否可用bool IsUseable
4.當生成器啟用后,計算所有所有可以路線路線
5.當生成敵人時,隨機選擇一條可以使用的路線
EnemySpawn 敵人生成器類?
定義變量:
GameObject[] enemyTypes:用于記錄敵人預制件
int startCount:用于記錄開始時需要創建的敵人數量
int spawnedCount:用于記錄已經產生的敵人數量
int maxCount:用于記錄產生敵人數量的上限
int maxDelay:用于記錄產生敵人的最大延遲時間
定義方法:?
CalculateWayLines():用于計算所有路線及坐標
GenerateEnemy():用于生成一個敵人。?
using System.Net.Mail; using System.Collections; using System.Collections.Generic; using UnityEngine;public class EnemySpawn : MonoBehaviour {//需要創建的敵人預制件public GameObject[] enmeyType;//需要創建敵人的最大數目public int maxCount = 5;//初始創建的敵人數目public int startCount = 2;//已經創建的敵人數目private int spawnCount;private Path[] paths;public int maxDelay = 10;//生成一個敵人public void GenerateEnemy(){spawnCount++;//如果生成數量已達到上限if(spawnCount>=maxCount) return;//延遲時間隨機Invoke("GreateEnemy", Random.Range(0, maxDelay));}private void GreateEnemy(){//選擇所有可以使用的路線Path[] usablePaths = SelectUsablePath();//隨機選擇一條可以使用的路線Path path = usablePaths[Random.Range(0, usablePaths.Length)];int randomIndex = Random.Range(0, enmeyType.Length);//Instantiate(敵人預制件,位置,旋轉角度);GameObject go = Instantiate(enmeyType[randomIndex], path.wayPoints[0], Quaternion.identity) as GameObject;//配置信息EnemyMotor motor = go.GetComponent<EnemyMotor>();motor.path = path;path.isUsable = false;//傳遞生成器引用go.GetComponent<EnemyStatusInfo>().spawn=this;}private void Start(){CalculateWayLines();GenerateEnemy();}private void CalculateWayLines(){paths = new Path[this.transform.childCount];for (int i = 0; i < paths.Length; i++){//每一條路線//路線變換組件的引用Transform path = this.transform.GetChild(i);//創建路線對象paths[i] = new Path(path.childCount);for (int pointIndex = 0; pointIndex < path.childCount; pointIndex++){paths[i].wayPoints[pointIndex] = path.GetChild(pointIndex).position;}}}//閑置可以使用的路線private Path[] SelectUsablePath(){List<Path> res = new List<Path>(paths.Length);//遍歷所有路線foreach (var path in paths){//如果可以使用,添加到res中if (path.isUsable) res.Add(path);}return res.ToArray();} }Path 路線類
using System.Collections; using System.Collections.Generic; using UnityEngine;public class Path {public Vector3[] wayPoints { get; set; }public bool isUsable{ get; set; }//構造函數public Path(int wayPointCount){wayPoints=new Vector3[wayPointCount];isUsable=true;} }總結
- 上一篇: 基于Web2.0的异构数字资源检索系统研
- 下一篇: 分式(类的理解)