SIKI学习——坦克大战04

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 ()
    {
		
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值