十四、武器攻击的处理
1 继承ATKandDamage()方法 重写其属性
2 处理动画状态机的Event事件
3 单利模式(比较容易取到List集合)
Public static SpawnManager _instance;
Void Awake(){
_instance=this;
}
4 攻击离Player距离最短的Moster
Public void AttackA(){
GameObject go=null;//存储最短攻击目标
Float diatance =attackDistance;
//只生成一个SpawnManager
Foreach(GameObject go in SpawnManager._instance.eremyList){
Vector3 temp=Vector3.Disance(this,go.transform.position);
If(temp<distance){
Distance=temp; //存储最短距离
Enemy=go; //存储最短攻击目标
}
}
If(enemy!=null){
//Player朝向enemy,怪物减血
Vector3 targetPos=enemy.transform.position;
Transform.position.y=targetPos.y;
transform.lookAt(targetPos);
Enemy.GetComponent<ATKandDamage>().TakeDamage(normalAttack);
}
}
5 处理枪的功能(子弹行走和子弹检测)
添加刚体组件,不受重力影响
1 监听子弹的OnTriggerEnter事件,处理怪物减血
2 子弹的实例化
//跟随根物体的旋转
GameObject go = GameObject.Instantiate(bullPrefabs,bulletPos,transform.root.rotation);
go.GetComponent<Bullet>().attack=attack;
十五、死亡效果的处理
anim.SetBool("Death", true);
EnemyManager._instance.enemyList.Remove(this.gameObject);
GameObject.Destroy(this.gameObject, 1f);
this.GetComponent<CharacterController>().enabled = false;
在的攻击事件中设置临时List集合来看存储符合条件的怪物
public void AttackRange()
{
List<GameObject> enemyList = new List<GameObject>(); //创建中介集合,防止怪物移除从集合移除中发生冲突
//距离小于AttackDIstance的怪物都受伤
foreach (GameObject go in EnemyManager._instance.enemyList)
{
float temp = Vector3.Distance(transform.position, go.transform.position);
if(temp<attackDistance)
{
enemyList.Add(go);
//go.GetComponent<ATKandDamage>().TakeDanmage(attackRange);
}
}
foreach(GameObject go in enemyList)
{
go.GetComponent<ATKandDamage>().TakeDanmage(attackRange);
}
}
十六、开发掉落物品
1 创建奖励物品类 AwardItem
public enum AwardType
{
Gun,
DualSword
}
public class AwardItem : MonoBehaviour {
public AwardType type;
void Start()
{
//设置刚体的角速度
this.GetComponent<Rigidbody>().velocity=new Vector3(Random.Range(-5, 5), 0, Random.Range(-5, 5));
}
}2 碰撞检测 OnColliderEnter(){}
接触地面停止运动
取消重力 使用动力学 设置为触发器
void OnCollisionEnter(Collision collision)
{
if(collision.collider.tag==Tags.ground)
{
rig.useGravity = false;
rig.isKinematic = true;
sCollider.isTrigger = true;
sCollider.radius = 2;
}
}
//实现触碰到主角 奖励物品开始移动想主角移动
3 触发检测 OnTriggerEnter(Collider collider){}{
If(collider.tag==Tags.player){
startMove==true;
Player=col.transform;
}
}
实践新知:奖励物品单独创建一个类,使用字段,每个奖品的Prefab都使用
十七、武器切换
1 生成奖励物品 SpawnAward()
1)在游戏物体死亡之后处理生成
2)使用随机数来处理奖励物品的生成
3)奖励物品的存在时间
2 武器切换类的逻辑(根据AwardType 来启用武器)
十九、攻击按钮的切换
1 使用单例模式来切换攻击面板
在切换武器的时候调用
二十、小地图的制作
1 创建小地图UI,使用父物体,使小地图按设定点旋转
2 创建小地图的类,设置单例来获取小地图的Sprits
float y = transform.eulerAngles.y; //获得player在y轴的旋转
playerIcon.localEulerAngles = new Vector3(0, 0, y);
3 敌人自动生成,需要懂动态创建图标
Public void BossIcon(){
GameObject go= NGUITools.AddChild(this.gameobject,enemyIconPrefab);
go.GetComponent<UISprite>().spriteName=”BossIcon”; //更换图标
Return go;
}
4 怪物身上创建EnemyIcon()
1 分别获得动态创建图标UI位置
2 以主角为中心创建坐标差
Vector offset=transfome.position-player.position;
icon.localPosition=new Vector(offset.x,offset.z,0);
二十一、添加声音
1 给主角添加AudioListener 主摄像机添加 AudioSoures
AudioSource.PlayClipAtPoint(deathClip, transform.position, 1f);
二十二、武器拖痕效果的制作
使用武器插件