Unity——子弹跟踪

在射击类游戏中,会经常遇到需要子弹自动跟踪的功能需求,考虑用简单的方法,实现一个子弹自动跟踪的效果。

重点实现逻辑功能,对于子弹的发射器的prefabs的设计不重点考虑,只使用简单的cube等3D物体来模拟子弹、发射器、目标。

实现思路

自动跟踪,即子弹的朝向始终面对目标物。

子弹的位置和朝向都跟随时间进行变化,最终到达目标物处。

代码实现

创建发射器

创建一个cube作为发射器,添加一个shot脚本,每2秒发射一个子弹。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class shot : MonoBehaviour
{public GameObject missile; // 子弹float currentTime;void Update(){currentTime += Time.deltaTime;if (currentTime > 2){currentTime = 0;GameObject m = GameObject.Instantiate(missile);m.transform.localPosition = Vector3.zero;m.SetActive(true);}}
}

创建子弹

创建一个Capsule作为子弹,将该子弹拖放到上面shot脚本中的missile属性中。并为子弹添加一个track脚本。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class track : MonoBehaviour
{public Transform target; //瞄准的目标Vector3 speed = new Vector3(0, 0, 5); //炮弹本地坐标速度Vector3 lastSpeed; //存储转向前炮弹的本地坐标速度int rotateSpeed = 90; //旋转的速度,单位 度/秒Vector3 finalForward; //目标到自身连线的向量,最终朝向float angleOffset;  //自己的forward朝向和mFinalForward之间的夹角RaycastHit hit;void Start(){//将炮弹的本地坐标速度转换为世界坐标speed = transform.TransformDirection(speed);}void Update(){CheckHint();UpdateRotation();UpdatePosition();}//射线检测,如果击中目标点则销毁炮弹void CheckHint(){if (Physics.Raycast(transform.position, transform.forward, out hit)){if (hit.transform == target && hit.distance < 1){Destroy(gameObject);}}}//更新位置void UpdatePosition(){transform.position = transform.position + speed * Time.deltaTime;}//旋转,使其朝向目标点,要改变速度的方向void UpdateRotation(){//先将速度转为本地坐标,旋转之后再变为世界坐标lastSpeed = transform.InverseTransformDirection(speed);ChangeForward(rotateSpeed * Time.deltaTime);speed = transform.TransformDirection(lastSpeed);}void ChangeForward(float speed){//获得目标点到自身的朝向finalForward = (target.position - transform.position).normalized;if (finalForward != transform.forward){angleOffset = Vector3.Angle(transform.forward, finalForward);if (angleOffset > rotateSpeed){angleOffset = rotateSpeed;}//将自身forward朝向慢慢转向最终朝向transform.forward = Vector3.Lerp(transform.forward, finalForward, speed / angleOffset);}}
}

创建目标物

创建一个sphere作为目标物。并拖到track脚本的target上。

效果

Unity——子弹跟踪相关推荐

  1. Unity镜头跟踪的四种方法

    Unity镜头跟踪的四种方法 新手代码 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.C ...

  2. Ruby‘s Adventrue游戏制作笔记(十六)Unity子弹数量及其UI

    Ruby's Adventrue游戏制作笔记(十六)Unity子弹数量及其UI 前言 一.创建新的UI 二.编辑脚本 三.创建获得子弹的道具 系列链接 前言 本文章是我学习Unity官方项目项目所做笔 ...

  3. Unity 子弹射击算法

    主要参考链接中的博主 其实最为关键的就是LookAt这个方法,让子弹看向屏幕中心点检测到的位置 参考链接地址 https://assetstore.unity.com/packages/essenti ...

  4. Unity 子弹的射击效果

    射击是FPS游戏中最重要的一环,如果实现一个简单的射击效果呢,来跟我一起学习一下吧 射击元素: 枪口 枪口决定了一个子弹初始时的位置和方向,可以使用一个空物体来代替,放置在射出子弹的位置, 子弹 射击 ...

  5. Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹

    Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...

  6. Ruby‘s Adventrue游戏制作笔记(十四)Unity播放游戏音效

    Ruby's Adventrue游戏制作笔记(十四)Unity播放游戏音效 前言 一.创建背景音乐 二.创建新的脚本 三.在其他需要播放的所有脚本中进行操作 四.给敌人添加音效 五.给玩家添加移动音效 ...

  7. Ruby‘s Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效

    Ruby's Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效 前言 一.把特效物品进行切割 二.创建 particle System 三.创建彩色球 四.再设置一下其他属性 五. ...

  8. Unity游戏优化指南大全(持续更新中!)

    Unity游戏优化指南大全 三个官方优化提示: 性能和优化 (Performance and Optimization) - 关于性能分析器以及性能和优化技巧的 Unity 学习教程. Best pr ...

  9. 【笔记】Unity优化 基础知识

    目录 Find 和 FindObjectOfType Camera.main 按 ID 寻址 与 UnityEngine.Object 子类进行 Null 比较 矢量和四元数数学以及运算顺序 使用非分 ...

最新文章

  1. 人脸识别未来发展如何更有“面子”?
  2. SqlServer修改数据库文件及日志文件存放位置
  3. 关于图像语义分割的总结和感悟
  4. 基于 EventBridge 构建 SaaS 应用集成方案
  5. 本地区间管理 oracle,Oracle:本地表空间管理,字典表空间管理
  6. 数据分析师的全景职业规划,入门、转行都先看这篇
  7. 您企业的邮件系统够安全吗
  8. 在 Linux 中安装 VMware Tools
  9. CSS3 炫酷简单动画 详解!
  10. CImage 设置任意像素的RGB值
  11. PHP生成腾讯云API签名
  12. 知言:《第一行代码》作者郭霖:不要成为工具的奴隶
  13. 基于反馈的动态补偿模型
  14. web前端学习(一):国内最常用,又优秀的web框架,Vue渐近式框架
  15. 微信无法连接到服务器的原因
  16. 财务人员的6大数据分析方法
  17. SAP上线时未清采购订单处理
  18. 台式计算机怎么截屏,台式电脑,怎么截图全屏?
  19. Java 中 == 与 equals 区别,再确认一遍?
  20. 入股联华马云新零售战略翻篇:最终要让电子商务成历史

热门文章

  1. 拓嘉启远:拼多多卖书对店铺的要求
  2. java 抽取 word,pdf 的四种武器
  3. KISSY基础篇乄目录
  4. 镜头之滤光片---关于日夜两用双通滤光片
  5. 西门子PLC能否通过以太网数据模块实现无线通讯?
  6. 操作系统的概念 (OS学习笔记)
  7. PX4模块设计之二十六:BatteryStatus模块
  8. C++实现方针顺时针旋转
  9. 爱奇艺视频显示列表CSS实现
  10. python批量修改文件名称及文件属性