unity动作的游戏开发笔记2

十四、武器攻击的处理

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 处理枪的功能(子弹行走和子弹检测)

添加刚体组件,不受重力影响

监听子弹的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 来启用武器)

十九、攻击按钮的切换

使用单例模式来切换攻击面板

在切换武器的时候调用

二十、小地图的制作

创建小地图UI,使用父物体,使小地图按设定点旋转

创建小地图的类,设置单例来获取小地图的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);

二十二、武器拖痕效果的制作

 使用武器插件

猜你喜欢

转载自blog.csdn.net/gsm958708323/article/details/76274249