Unity3D 《坦克大战》案例源码过程
使用的是Unity 2018版和VS2019
创建新的工程,导入素材包,下面为链接:
链接:https://pan.baidu.com/s/1_KLjColSJVN123aLy4_4fw
提取码:o101
导入素材
接着我们要做游戏里的物体,我们打开Project面板Assets文件夹下的GameResource文件,下面有三个文件夹,从上到下分别是声音、字体和图片。我们找到玩家的图片、按照以下方法,创造一个实体。
接着按这样的方法将草丛(Grass)、可以被子弹打穿的障碍墙(Wall)、不可被子弹打穿的障碍墙(Barrier)、空气墙(AirBarriar)、老鹰标志(Heart…就是我们要保护的老窝)
接下来我们来做会动的水(River)、爆炸效果(Explosion)、无敌效果(Shield)、出生效果(Born)!我们拿爆炸效果为例:
按住Ctrl键同时选中两张爆炸效果的图片,然后拖到左边的目录下;
创建一个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)不然向下掉
下面给出子弹创建一个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
代码只有一个销毁自身