2D坦克大战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wang_lvril/article/details/79783950

1.Player预制体

添加BoxCollider2D RigidBody2D Gravity Scale=0
移动转向:移动 transform.Translate(Vector.方向*速度*Time.fixdDeltaTime,Space.World);
                  转向 通过改变SpriteRender的Soprite属性。SpriteRender sr=GetComponent<SpriteRender>();
                  public  Sprite[] TankSprite;    if(h>0) sr.Sprite=tankSprite[];   bullectEulerAngles = new Vector3(0, 0, 90);
攻击:if((Input.GetKeyDown(Keycode.Space))     private Vector3  bullectEulerAngles;
          Instantiae(bulletPrefab,transform.position,Quaternion.Eular(transform.eulerAngles+bullectEulerAngles));
攻击CD:private float timeAttack =0.4f ; 
         FixedUpdate() 固定物理帧 { Move();  if(timeAttack==0.4){  Attack() ;}else { timeAttack+= Time.fixedDeltaTime; } }
无敌3s:private bool isDefended = true;   Update()=>if(isDefende) defendPrefab.SetActive=ture; 
              private bool isDefended = true;   defendTime -= Time.deltaTime;  isDefended = false;
              defendPrefab.SetActive(false);
死亡: Die()=>if (isDefended) return;  Instantiate(explosionPrefab, transform.position, transform.rotation); 
            Destroy(gameObject);  PlayerManager._instance.isDead = true;

2.子弹预制体

添加BoxCollider2D ,RigidBody2D Gravity Scale=0;       public bool isPlayerBullect;
移动:transform.Translate(transform.up* moveSpeed * Time.deltaTime, Space.World);
碰撞:Switch(collision.tag)=> Case "Tank": if(!isPlayerBullect)=>collision.SendMessage("Die");Destory;
          Case "Enemy": if(isPlayerBullet)=>collision.SendMessage("Die").Destory(); ... ... ... ... ... ...

3.敌人AI

随机移动:private float changDir=3,float v, h=-1;
                 if(changDir>=3)=>int num = Random.Range(0, 8);
                 =>if(num>5)=>v=-1;h=0; ... ... ... ... changDir=0;     else=> changDir+=Time.DealtTime;
                 移动转向和Player一样。
自动攻击:取消Input.GetKeyDown 同Player。
死亡:同Player。PlayerManager.Instance.Score++;

4.PlayerManager

public static PlayerManager Instance;
public bool isDead;   //玩家死亡      public int lifeValue = 3;    //生命
public bool isDefeat; //游戏结束      public int playScore = 0;  //得分
复活:private void Recover()=>if(lifeValue<=0) isDefeat=true;  Invoke("ReturnMain",2);
          else=>lifeValue--;  GameObject go = Instantiate(born, new Vector3(-2, -8, 0), Quaternion.identity);
          go.GetComponent<Born>().createPlayer = transform;   isDead = false;
Update()=> if(isDefeat)=>Invoke("ReturnMain",2);return; if(isDead)=>Recover();  hp.text=lifeValue.ToString();

5.随机生成地图

public GameObject[ ] item; //初始化地图数组  //0 老家 //1 墙 //2 障碍 //3 出生 //4河流 //5 草 // 空气墙
private List<Vector3> itemPos = new List<Vector3>();
实例化方法  Void CreateItem(GameObject createGame, Vector3 pos, Quaternion quaternion)
                    =>GameObject itmeGo = Instantiate(createGame, pos, quaternion);
                    itmeGo.transform.SetParent(gameObject.transform);
                    itemPos.Add(pos);  
判断该位置是否存在列表中
   private bool HasThePos(Vector3 createPos) {
       for (int i = 0; i < itemPos.Count; i++) {
           if (createPos == itemPos[i]) {
               return true;
       return false;
   }
随机产生位置
    private Vector3 CreateRandomPos() {
        while (true) {
            Vector3 createPosition = new Vector3(Random.Range(-9, 10), Random.Range(-7, 8), 0);
            if (!HasThePos(createPosition)) {
                return createPosition;
    }
    //敌人随机位置
    private void CreateEnemy() {
        int num = Random.Range(0, 3);
        Vector3 enemyPos = new Vector3();
        if (num == 0)
              enemyPos = new Vector3(-10, 8, 0);
        CreateItem(item[3], enemyPos, Quaternion.identity);
    }
Awake(){        
       //家
        CreateItem(item[0],new Vector3(0,-8,0),Quaternion.identity);
        CreateItem(item[1], new Vector3(-1, -8, 0), Quaternion.identity);
        CreateItem(item[1], new Vector3(1, -8, 0), Quaternion.identity);
        for (int i = -1; i < 2; i++) 
            CreateItem(item[1], new Vector3(i, -7, 0), Quaternion.identity);        
        //玩家
        GameObject go = Instantiate(item[3], new Vector3(-2, -8, 0), Quaternion.identity);
        go.GetComponent<Born>().createPlayer = true;
        //敌人
        CreateItem(item[3], new Vector3(-10, 8, 0), Quaternion.identity);
        CreateItem(item[3], new Vector3(0, 8, 0), Quaternion.identity);
        CreateItem(item[3], new Vector3(10, 8, 0), Quaternion.identity);
        InvokeRepeating("CreateEnemy", 4, 5);
        //外墙
        for (int i = -11; i < 12; i++) {
            CreateItem(item[6], new Vector3(i, 9, 0), Quaternion.identity);
            CreateItem(item[6], new Vector3(i, -9, 0), Quaternion.identity);
        }
        for (int i = -8; i < 9; i++)
        {
            CreateItem(item[6], new Vector3(-11, i, 0), Quaternion.identity);
            CreateItem(item[6], new Vector3(11, i, 0), Quaternion.identity);
        }
        //地图
        for (int i = 0; i < 60; i++) 
            CreateItem(item[1], CreateRandomPos(), Quaternion.identity);     
            CreateItem(item[2], CreateRandomPos(), Quaternion.identity);           
            CreateItem(item[4], CreateRandomPos(), Quaternion.identity);
            CreateItem(item[5], CreateRandomPos(), Quaternion.identity);       
}

6.其他

添加声音:Public AudioClip audio;   AudioSource.PlayClipAtPoint(dieAudio, transform.position);

猜你喜欢

转载自blog.csdn.net/wang_lvril/article/details/79783950