2020-11-30

Unity3D 《坦克大战》案例源码过程

使用的是Unity 2018版和VS2019
创建新的工程,导入素材包,下面为链接:
链接:https://pan.baidu.com/s/1_KLjColSJVN123aLy4_4fw
提取码:o101
导入素材
2020-11-30
接着我们要做游戏里的物体,我们打开Project面板Assets文件夹下的GameResource文件,下面有三个文件夹,从上到下分别是声音、字体和图片。我们找到玩家的图片、按照以下方法,创造一个实体。
2020-11-30
接着按这样的方法将草丛(Grass)、可以被子弹打穿的障碍墙(Wall)、不可被子弹打穿的障碍墙(Barrier)、空气墙(AirBarriar)、老鹰标志(Heart…就是我们要保护的老窝)
2020-11-30
接下来我们来做会动的水(River)、爆炸效果(Explosion)、无敌效果(Shield)、出生效果(Born)!我们拿爆炸效果为例:

按住Ctrl键同时选中两张爆炸效果的图片,然后拖到左边的目录下;
2020-11-30
创建一个Player脚本托在坦克上
我将坦克的最终代码写了出来,防止分开写大家看不懂,比较绕
代码如下:

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

public class Player : MonoBehaviour
{
//子弹欧拉角
private Vector3 bullectEulerAngles;
private float moveSpeed = 3;
private float timeVal;
private float defendTimeVal = 3f;
//渲染坦克转弯后的素材
private SpriteRenderer sr;
public Sprite[] tankSprite; //上右下左

private bool isDefended = true;

public GameObject explosionPrefab;
public GameObject bullectPrefab;
public GameObject defendEffectPrefab;
private void Awake()
{
    sr = GetComponent<SpriteRenderer>();
}
private void Update()
{
    //是否处于无敌状态
    if (isDefended)
    {
        defendEffectPrefab.SetActive(true);
        defendTimeVal -= Time.deltaTime;
        if (defendTimeVal <= 0)
        {
            Debug.Log(111);
            isDefended = false;
            defendEffectPrefab.SetActive(false);
        }
    }
}

private void FixedUpdate()
{
    if (PlayerManager.Instance.isDefeat)
    {
        return;
    }
    Move();
    //攻击cd
    if (timeVal >= 0.4f)
    {
        Attack();
    }
    else
    {
        timeVal += Time.fixedDeltaTime;
    }
}

//移动
public void Move()
{
    float v = Input.GetAxisRaw("Vertical");//垂直轴值输入
    transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);
    if (v < 0) 
    {
        sr.sprite = tankSprite[2];
        bullectEulerAngles = new Vector3(0, 0, -180);
    }
    else if (v > 0)
    {
        sr.sprite = tankSprite[0];
        bullectEulerAngles = new Vector3(0, 0, 0);
    }

    //优先级问题,优先向垂直方向走
    if (v != 0)
    {
        return;
    }

    float h = Input.GetAxisRaw("Horizontal");//水平轴值输入  返回-1到1
    transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
    //移动时调整方向
    if (h < 0) 
    {
        sr.sprite = tankSprite[3];
        bullectEulerAngles = new Vector3(0, 0, 90);
    }
    else if (h > 0)
    {
        sr.sprite = tankSprite[1];
        bullectEulerAngles = new Vector3(0, 0, -90);
    }
}

//子弹射击
private void Attack()
{
    if (Input.GetKeyDown(KeyCode.J))
    {
        //实例化 子弹产生角度:当前坦克角度+子弹应该旋转的角度   欧拉角
        Instantiate(bullectPrefab, transform.position, Quaternion.Euler(transform.eulerAngles + bullectEulerAngles));
        timeVal = 0f;
    }
}

//坦克得死亡方法
private void Die()
{
    if (isDefended)
    {
        return;//跳过死亡方法
    }

    PlayerManager.Instance.isDead = true;

    //产生爆炸特效
    Instantiate(explosionPrefab, transform.position, transform.rotation);
    //死亡
    Destroy(gameObject);
}

}

这里是坦克的属性面板,赋值。记得向坦克加刚体和碰撞体
将刚体里的Gravity Scale(重力改为0)不然向下掉2020-11-30
下面给出子弹创建一个Bullect类的最终代码如下:

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

public class Bullect : MonoBehaviour {

    public bool IsPlayerBullect;
    // Use this for initialization
    void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		transform.Translate(transform.up * 10 * Time.deltaTime, Space.World);
	}


    //碰撞检测
    private void OnTriggerEnter2D(Collider2D collision)
    {
        switch (collision.tag)
        {
            case "Player": //打到自己
                if (!IsPlayerBullect)
                {
                    collision.SendMessage("Die");
                    Destroy(gameObject);
                }
                break;

            case "Heart"://打到家
                collision.SendMessage("HeartDie");
                Destroy(gameObject);
                break;

            case "Enemy"://打到敌人
                if (IsPlayerBullect)
                {
                    collision.SendMessage("Die");
                    Destroy(gameObject);
                }
                break;

            case "Barrier"://打到障碍物
                Destroy(gameObject);
                //AudioSource.PlayClipAtPoint(hitAudio, transform.position);
                break;

            case "Wall"://打到墙
                Destroy(collision.gameObject);
                Destroy(gameObject);
                break;

            default:
                break;
        }
    }
}同样向子弹中添加刚体和碰撞体
碰撞体中又Is Ttigger属性 打上对勾
将刚体里的Gravity Scale(重力改为0)不然向下掉
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20201130214024546.png?,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUwNjc2Mjg2,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](https://www.icode9.com/i/ll/?i=20201130213954246.png)
坦克被击中时会爆炸(爆炸特效及代码)爆炸特效在上面已经做了 名字是Explode
代码只有一个销毁自身

上一篇:Kubernetes实战总结 - EFK部署(v7.6.0)


下一篇:[HDU4940]Destroy Transportation system