Unity坦克大战总结

10 篇文章 1 订阅

简单逻辑图
在这里插入图片描述
游戏主要逻辑功能的实现逻辑。

玩家

1.移动功能


Input.GetAxisRaw();//用于形成方向

//处理移动的旋转方向
Rotation = Quaternion.Euler(0, 0, 旋转角);
transform.rotation = Rotation;

//移动
transform.Translate();

2.攻击功能

Instantiate(bulletPerfab, transform.position, Rotation)//Rotation为坦克的旋转角

3.死亡处理
销毁自身
初始化各参数
敌人
敌人的本质其实和玩家差不多,只不过移动方向和射击间隔是随机的。

**

子弹

**
首先我们要知道子弹分为敌人的子弹和主角的子弹,同一类型的子弹碰到同一类型的人物并不会销毁该对象。还有就是子弹脚本的设计,它既可以设置为一个脚本也可以设置为多个脚本。
设置为一个其实就是加了几个开关用来储存子弹的状态,下面是设置为一个脚本时的代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class bullet : MonoBehaviour
{

    public bool isPlayerBullet=true;//是否是人物子弹
    public bool Player12;//是玩家1还是玩家2的子弹
    public bool isPenetrate;//是否可以击穿障碍物
    void Update()
    {
        if (Player12)
        {
            transform.Translate(Vector3.up * PalyerManage.Instant.bulletspeed[0] * Time.deltaTime);
        }
        else
        {
            transform.Translate(Vector3.up * PalyerManage.Instant.bulletspeed[1] * Time.deltaTime);
        }
       
    }
    
    private void OnTriggerEnter2D(Collider2D collision)
    {
        switch (collision.gameObject.tag)
        {
            case "player":
                if (!isPlayerBullet)
                {
                    collision.gameObject.SendMessage("Death");
                    Destroy(gameObject);
                }
                break;
            case "player2":
                if (!isPlayerBullet)
                {
                    collision.gameObject.SendMessage("Death");
                    Destroy(gameObject);
                }
                break;
            case "Enemy":
                if (isPlayerBullet)
                {
                    if (Player12)
                    {
                        collision.gameObject.SendMessage("Death", 1);//SendMessage不能传0
                    }
                    else
                    {
                       collision.gameObject.SendMessage("Death",2);
                    }
                   
                    Destroy(gameObject);
                }
                break;
            case "hoom":
                Destroy(gameObject);
                collision.gameObject.SendMessage("IsDestroy");
                PalyerManage.Instant.isGameOver = true;
                break;
            case "wall":
                Destroy(gameObject);
                Destroy(collision.gameObject);
                break;
            case "airWall":
                Destroy(gameObject);

                break;
            case "barrier":
                if (isPenetrate)
                {
                    Destroy(gameObject);
                    Destroy(collision.gameObject);
                }
                else
                {
                    Destroy(gameObject);
                }               
                break;

            default:
                break;
        }
    }

   

}
          

地图

1.地形的初始化
通过各种地形的预制体来初始化地形,并贮存已有地形的坐标
2.出生特效之人物和敌人的初始化
通过仔细品味我们可以发现这和子弹的模式差不多,我们可以写一个脚本,然后通过开关来控制是生成敌人还是主角。

3.奖励的生成
奖励的生成没什么好说的,就是使用Instantiate,主要是各种奖励功能的实现。
1.(坦克)生命加1:这个比较简单,我们可以通过查找主角的标签,然后改变它的HP.

2.(手雷)销毁地图上所有敌人:第一种方式是每生成一个敌人就添加到一个定义好了的链表里,注意该链表一定是在地图里一直存在的游戏对象上,吃到该奖励后通过遍历该链表把不为空的敌人销毁。

第二种方式就是直接查找场景里标签为敌人的游戏对象,然后销毁。我个人比较赞同使用第一种方法,因为查找场景里标签为敌人的游戏对象需要遍历场景里所有对象,相对第一种方法明显效率比较低。当然还有其它方法实现该功,能这里就不细讲。

3.(闹钟)使地图上所有敌人静止(包含在该时段生成的敌人):这个其实我们在敌人的脚本里定义一个控制敌人的静态bool变量的开关,吃到该奖励后改变它的值,使其值改变,然后让他停止射击和移动。

4.(帽子)保护自己:主角一开始生成时就有一个保护罩,我们只需要重新调用一下它。

5.(工兵铲)保护家:我们可以使用两个链表来来储存两种家的墙,一种是可以打穿,一种是不可以。然后在游戏开始的时候把第二种墙隐藏,第一种显示,吃到第奖励时把第一种墙隐藏,第二种显示。
6.(星星)使坦克各属性变化:注意死亡后重新累计星星效果。

 switch (PalyerManage.Instant.effect[0])
            {
                case 0:
                    //一颗攻速增加,坦克变形
                    Transform Palyer1 = GameObject.FindGameObjectWithTag("player").transform;
                    Palyer1.GetComponent<SpriteRenderer>().sprite = ChangeRole[0];
                    PalyerManage.Instant.AttackCD[0] -= 0.5f;
                    PalyerManage.Instant.effect[0]++;
                    break;
                case 1:
                    //2颗攻击增加
                    PalyerManage.Instant.Attack[0] += 1;
                    PalyerManage.Instant.effect[0]++;
                    break;
                case 2:
                    //3颗坦克变形可以打障碍
                    Palyer1 = GameObject.FindGameObjectWithTag("player").transform;
                    Palyer1.GetComponent<SpriteRenderer>().sprite = ChangeRole[1];
                    PalyerManage.Instant.effect[0]++;
                    break;
                case 3:
                    //四颗攻速增加
                    PalyerManage.Instant.AttackCD[0] -= 0.25f;
                    PalyerManage.Instant.effect[0]++;
                    break;
                case 4:
                    //5颗坦克变形,攻击增加
                    Palyer1 = GameObject.FindGameObjectWithTag("player").transform;
                    Palyer1.GetComponent<SpriteRenderer>().sprite = ChangeRole[2];
                    PalyerManage.Instant.effect[0]++;
                    break;
                default:
                    break;
                   
            }
            PalyerManage.Instant.speed[0] += 0.5f;//吃到星星奖励后移动速度增加
            PalyerManage.Instant.bulletspeed[0] += 0.5f;//吃到星星奖励后射出的子弹速度增加

传递游戏数据

(1)在游戏的开始界面,当我们触发开始按钮使通过 PlayerPrefs.Set数据类型()设置游戏数据。

PlayerPrefs.SetInt("Effect", 0);
                PlayerPrefs.SetInt("HP", 3);
                PlayerPrefs.SetInt("Attack", 1);
                PlayerPrefs.SetFloat("AttackCD", 1);

(2)生成主角时传入数据。

 HP[0] = PlayerPrefs.GetInt("HP", 3);
            Attack[0] = PlayerPrefs.GetInt("Attack", 1);
            AttackCD[0] = PlayerPrefs.GetFloat("AttackCD", 1);
            effect[0] = PlayerPrefs.GetInt("Effect", 0);

(3)赢得游戏时,储存当前游戏数据

public void Win()
{
    if (EnemyNum<=0)
    {

        PlayerPrefs.SetInt("Effect", PalyerManage.Instant.effect[0]);
        PlayerPrefs.SetInt("HP", PalyerManage.Instant.HP[0]);
        PlayerPrefs.SetInt("Attack", PalyerManage.Instant.Attack[0]);
        PlayerPrefs.SetFloat("AttackCD", PalyerManage.Instant.AttackCD[0]);

    }
        
}

(4)失败时加载游戏的开始场景

下面是游戏运行的视频。

tank.mp4

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值