1.子弹的移动和CD值的设置
01.子弹的移动
新建子弹的脚本
在子弹的脚本中写
transform.Translate(transform.up*moveSpeed*Time.deltaTime, Space.World);//子弹当前是沿着自身坐标系下移动的,现在必须写(Space.World)如果不是沿着自身,不填也行,默认也是世界坐标系
02.子弹CD值的设置
在坦克Player的脚本中设置
timeVal——子弹发射的CD值
在update中设置值
if (timeVal >= 0.4f)
{
Attack();
}
else
{
timeVal += Time.deltaTime;
}
在攻击方法中将时间归零
timeVal = 0;
添加子弹的触发器和碰撞器
给Bullet添加碰撞器和刚体并开启触发器
给子弹可能碰到的物体添加Tag标签
Player——Tank
Wall——Wall
Heart——Heart
Barriar——Barriar
Enemy——Enemy
这里在子弹的脚本里编辑,
/// <summary>
/// 子弹的触发检测
/// </summary>
/// <param name="collision"></param>
private void OnTriggerEnter2D(Collider2D collision)
{
switch (collision.tag)
{
case "Tank":
break;
case "Heart":
break;
case "Enemy":
break;
case "Wall":
break;
case "Barriar":
break;
default:
break;
}
}
创建空气墙
复制一个Barriar,删除Sprite Renderer组件,更名为AirBarriar
并拖拽成预制体进Map文件夹
玩家无敌方法与死亡方法
玩家死亡是生成爆炸特效并且坦克消失
//产生爆炸特效
Instantiate(explosionPrefab,transform.position,transform.rotation);
//坦克的死亡方法
Destroy(gameObject);
新建爆炸特效的脚本Explosion
在爆炸特效的脚本中添加清除爆特效的代码
Destroy(gameObject,0.167f);
在子弹的脚本的触发检测方法中:当子弹碰撞到坦克时调用坦克的死亡方法
case "Tank":
collision.SendMessage("Die");//调用玩家的死亡方法 不知道怎么会这样用的?如果有知道额可否告知下?
break;
玩家无敌方法的编写
将玩家的无敌特效Shield设置成玩家的子物体,以避免每次生成浪费性能,并将Shield Reset一下
private float defendTimeVal=3;
private bool isDefended=true;//默认都是false
public GameObject defendEffectPrefab;
defendEffectPrefab 受保护的特效
//是否处于无敌状态
if (isDefended)
{
defendEffectPrefab.SetActive(true);
defendTimeVal -= Time.deltaTime;
if (defendTimeVal<=0)
{
isDefended = false;
defendEffectPrefab.SetActive(false);
}
}
为了避免玩家无敌的方法一直使用
/// <summary>
/// 坦克的死亡方法
/// </summary>
public void Die()
{
if (isDefended)
{
return;
}
//产生爆炸特效
Instantiate(explosionPrefab,transform.position,transform.rotation);
//坦克的死亡方法
Destroy(gameObject);
}
在此附上目前为止所用的的所有代码
玩家身上的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
//属性值
public float moveSpeed = 3;//移动速度
private Vector3 bulletEulerAnles;//定义子弹的需要旋转的欧拉角
private float timeVal;//设置子弹发射的CD值
private bool isDefended=true;//玩家被保护状态判断
private float defendTimeVal=3;//玩家无敌时间计时器
//引用
private SpriteRenderer sr;//通过切换图片改变转向
public Sprite[] tankSprite;//切换用到的图片第一张0上第二张8右第三张16下第四张24左
public GameObject bulletPrefab;//子弹的预制物
public GameObject explosionPrefab;//特效预制体
public GameObject defendEffectPrefab;//受保护的特效
void Start ()
{
sr = GetComponent<SpriteRenderer>();
}
void Update ()
{
//是否处于无敌状态
if (isDefended)
{
defendEffectPrefab.SetActive(true);
defendTimeVal -= Time.deltaTime;
if (defendTimeVal<=0)
{
isDefended = false;
defendEffectPrefab.SetActive(false);
}
}
//攻击的CD
if (timeVal >= 0.4f)
{
Attack();
}
else
{
timeVal += Time.deltaTime;
}
}
private void FixedUpdate()//固定物理帧
{
Move();
}
/// <summary>
/// 坦克的攻击方法
/// </summary>
private void Attack()
{
if (Input.GetKeyDown(KeyCode.Space))
{
//子弹产生的角度:当前坦克的角度加上子弹应该旋转的角度
Instantiate(bulletPrefab,transform.position,Quaternion.Euler(transform.eulerAngles+bulletEulerAnles));//实例化子弹
timeVal = 0;
}
}
/// <summary>
/// 坦克的移动方法
/// </summary>
private void Move()
{
float v = Input.GetAxisRaw("Vertical");
transform.Translate(Vector3.up * v * moveSpeed * Time.fixedDeltaTime, Space.World);//fixedDeltaTime每一帧都是固定的秒数
if (v < 0)
{
sr.sprite = tankSprite[2];
bulletEulerAnles = new Vector3(0, 0, -180);//子弹向下
}
else if (v > 0)
{
sr.sprite = tankSprite[0];
bulletEulerAnles = new Vector3(0,0,0);//子弹向上
}
//设置移动的优先级
if (v != 0)
{
return;//同时按下两个方向键,只能在垂直方向上移动
}
float h = Input.GetAxisRaw("Horizontal");
transform.Translate(Vector3.right * h * moveSpeed * Time.fixedDeltaTime, Space.World);//点击往右移动返回1点击往左移动返回-1 Space.World以世界坐标轴来移动
if (h < 0)
{
sr.sprite = tankSprite[3];
bulletEulerAnles = new Vector3(0, 0, 90);//子弹指向左边
}
else if (h > 0)
{
sr.sprite = tankSprite[1];
bulletEulerAnles = new Vector3(0,0,-90);//子弹指向右边
}
}
/// <summary>
/// 坦克的死亡方法
/// </summary>
public void Die()
{
if (isDefended)
{
return;
}
//产生爆炸特效
Instantiate(explosionPrefab,transform.position,transform.rotation);
//坦克的死亡方法
Destroy(gameObject);
}
}
子弹身上的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public float moveSpeed = 10;
void Start ()
{
}
void Update ()
{
transform.Translate(transform.up*moveSpeed*Time.deltaTime, Space.World);//子弹当前是沿着自身坐标系下移动的,现在必须写(Space.World)如果不是沿着自身,不填也行,默认也是世界坐标系
}
/// <summary>
/// 子弹的触发检测
/// </summary>
/// <param name="collision"></param>
private void OnTriggerEnter2D(Collider2D collision)
{
switch (collision.tag)
{
case "Tank":
collision.SendMessage("Die");//调用玩家的死亡方法
break;
case "Heart":
break;
case "Enemy":
break;
case "Wall":
break;
case "Barriar":
break;
default:
break;
}
}
}
爆炸特效身上的脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Explosion : MonoBehaviour
{
void Start ()
{
Destroy(gameObject,0.167f);
}
void Update ()
{
}
}