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);}}//攻击的CDif (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 (){}
}

SIKI学习——坦克大战04相关推荐

  1. SIKI学习——坦克大战03

    1.控制图片的移动以及转向 新建文件夹Scripts 打开Player脚本编写移动代码 注释:图片的转向可以直接改图片的转向或者通过切换图片来改变朝向,或者通过控制Z轴的旋转来改变朝向. 图片的移动 ...

  2. SIKI学习——坦克大战06

    1. 敌人AI 改变敌人的移动和生成子弹的时间间隔. using System.Collections; using System.Collections.Generic; using UnityEn ...

  3. 韩老师坦克大战2.0版本

    本博文源于对b站视频韩老师(韩顺平)的java学习,本章学习坦克大战2.0版本,用多线程实现,本章内容还是比较多的,先看内容效果 内容效果 开局 被打死(黄色是hero) 打死别人 源码 Bomb.j ...

  4. 小白学习Unity 3D做经典游戏坦克大战日常

    老师 | Trigger 学习者 |小白 出品 | Siki 学院 Hello,小伙伴们.接下来小白跟Trigger老师做一款2D游戏坦克大战.从素材.代码到场景和UI的游戏开发.小白把日常遇到的问题 ...

  5. HTML5制作坦克大战游戏+Canvas绘制基础图形——学习笔记一

    1.离线存储:1)存储到本地,可以离线浏览网页  2)不用cookie(安全性不太高,来回交互的数据量比较大) 2.语音识别 3.图像识别 4.HTML5游戏 5.CSS3的强大之处:动画和各种选择器 ...

  6. JavaScript面向对象实现-坦克大战(附前端全套学习路线)

    [课程简介] 使用javascript+面向对象实现一个坦克大战游戏,让更多的同学能更加深入地理解面向对象思想. [主讲内容] 1. 讲解什么是面向对象,javascript中如何实现面向对象 2. ...

  7. 马士兵坦克大战学习笔记(一)

    java初学者对于马士兵坦克大战的个人学习笔记及代码问题总结(第一阶段), 1.系统自动初始化了Graphics g参数 2.设计原则:高内聚,低耦合: 一个模块中的各元素之间的紧密程度越高,内聚性越 ...

  8. Java练手项目2:基于Java的坦克大战游戏(学习Java必备!!!)

    1.引言 随着社会和时代的进步,来自各个方面的压力让人没精打采,为了分解人们的压力,休养那变得疲顿的头脑和劳累的身心,特设计了坦克大战小游戏,游戏操作非常容易,只要将手指放在键盘上敲击相关的游戏键就可 ...

  9. CocosCreator项目学习系列lt;三gt;BattleCity_90tank坦克大战项目的学习

    CocosCreator项目学习系列<三>坦克大战项目的学习<25/12/2017> 知识点总结: 1.TileMap的使用精髓; 2.Joystick虚拟摇杆的整合单脚本; ...

最新文章

  1. python+unittest+excel接口自动化_Python+requests+unittest+excel实现接口自动化测试框架
  2. 异步http 超时_具有CompletableFuture的异步超时
  3. js有默认参数的函数加参数_函数参数:默认,关键字和任意
  4. 7-5 公路村村通 (30 分)(C语言实现)
  5. Yolo系列知识点梳理(Yolov1-v5)
  6. 【LeetCode笔记】剑指 Offer 46. 把数字翻译成字符串(Java、字符串、动态规划、DFS)
  7. Bash中的位置参数和特殊参数
  8. MIDL2011报错。
  9. 从零开始学习Android开发-Android概览
  10. 查询任意汉字的Unicode编码,UTF8编码,GB2312编码,GBK编码
  11. APP安全——抓包代理工具的设置
  12. 如何规划自己的人生未来
  13. pt和px有什么区别?pt和px如何转换?
  14. cesium中实现热力图
  15. html5多媒体事件写法,多媒体元素重要事件 -HTML5
  16. 永久免费 内网穿透工具 傻瓜式配置
  17. 如何注册自己的企业邮箱?
  18. α-IoU | 再助YOLOv5登上巅峰,造就IoU Loss大一统
  19. 经济基础知识(初级)【16】
  20. S/4 HANA标准表MARC增强字段

热门文章

  1. 【Java】Object 转成 Map<String,Object>
  2. Android8.0 ZenMode 静音模式
  3. 计算机科学实验班高考线,北京工业大学计算机科学与技术(实验班)专业2016年在吉林理科高考录取最低分数线...
  4. Photoshop for Designers: Filters 适用于设计师的Photoshop:滤镜 Lynda课程中文字幕
  5. python如何将列表中的每个数字都保留两位有效数字
  6. C++_OpenCV获取图像中某个坐标的像素值信息
  7. dreamweaver郑州旅游网页设计制作 简单静态HTML网页作品 我的家乡网页作业成品 学生旅游网站模板...
  8. 英超引入 AI 球探,国足不学习一下?
  9. c#检测网络连接信息
  10. 985Java程序员的三次面试总结,京东,华为,去哪儿 , 已拿offer