坦克大战
游戏简介
个人的第一个小游戏demo,用Unity制作,任务:保卫家里的的目标人物,直到通关。
开发流程
场景搭建及其素材处理
主摄像机参数
素材处理
单张图转化成UI,设置成Single,雪碧图转化成UI,设置成Multiple,切割雪碧图,点击Sprite Editor
预制体的制作,2D动画的制作
将贴图直接放在Hierarchy面板下,调整大小,拖回Prafabs文件夹下,形成预制体。
简单2D动画的制作,创建Animation文件夹,按住ctrl将多个图片拖入Hierarchy面板下,命名并保存到Animation文件夹。
控制玩家的移动及其方向
public class Player : MonoBehaviour
{
public float moveSpeed = 3;
private SpriteRenderer sr;
public Sprite[] tankSprite; //上右下左
private void Awake()
{
sr = GetComponent<SpriteRenderer>();
}
private void Update()
{
float h = Input.GetAxisRaw("Horizontal");//水平轴值输入 返回-1到1
transform.Translate(Vector3.right * h * moveSpeed * Time.deltaTime, Space.World);
//移动时调整方向
if (h < 0)
sr.sprite = tankSprite[3];
else if(h>0)
{
sr.sprite = tankSprite[1];
}
float v = Input.GetAxisRaw("Vertical");//垂直轴值输入
transform.Translate(Vector3.up * v * moveSpeed * Time.deltaTime, Space.World);
if (v < 0)
sr.sprite = tankSprite[2];
else if (v > 0)
{
sr.sprite = tankSprite[0];
}
}
}
添加碰撞器,解决抖动
给player加刚体和碰撞器,给其他障碍物加碰撞器
在刚体组件下点击Constraints 把Z轴锁死,就可以解决移动当中的旋转
把代码放在FiexedUpdate生命周期函数中,因为固定帧数,可以解决抖动
移动优先级问题,2D渲染层级问题
//优先级问题,优先向垂直方向走
if (v != 0)
{
return;
}
Oorder in Layer 越大层级越高
坦克的攻击方法
private void Attack()
{
if(Input.GetKeyDown(KeyCode.J))
{
//实例化 子弹产生角度:当前坦克角度+子弹应该旋转的角度 欧拉角
Instantiate(bullectPrefab, transform.position, Quaternion.Euler(transform.eulerAngles+ bullectEulerAngles));
}
}
子弹的移动以及攻击CD
子弹的移动与坦克的移动类似
可以设置一个计时器来控制子弹的发射CD
子弹的碰撞检测
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;
}
}
空气墙的制作,死亡方法和无敌方法
将Barrier的Sprite Renderer删除就做出了一个空气墙的预制体
private void Die()
{
if(isDefended)
{
return;//跳过死亡方法
}
//产生爆炸特效
Instantiate(explosionPrefab, transform.position, transform.rotation);
//死亡
Destroy(gameObject);
}
//是否处于无敌状态
if (isDefended)
{
defendTimeVal -= Time.deltaTime;
shieldPrefab.SetActive(true);
if (defendTimeVal<0)
{
isDefended = false;