Unity——子弹跟踪
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——子弹跟踪相关推荐
- Unity镜头跟踪的四种方法
Unity镜头跟踪的四种方法 新手代码 固定相机跟随,这种相机有一个参考对象,它会保持与该参考对象固定的位置,跟随改参考对象发生移动 using UnityEngine; using System.C ...
- Ruby‘s Adventrue游戏制作笔记(十六)Unity子弹数量及其UI
Ruby's Adventrue游戏制作笔记(十六)Unity子弹数量及其UI 前言 一.创建新的UI 二.编辑脚本 三.创建获得子弹的道具 系列链接 前言 本文章是我学习Unity官方项目项目所做笔 ...
- Unity 子弹射击算法
主要参考链接中的博主 其实最为关键的就是LookAt这个方法,让子弹看向屏幕中心点检测到的位置 参考链接地址 https://assetstore.unity.com/packages/essenti ...
- Unity 子弹的射击效果
射击是FPS游戏中最重要的一环,如果实现一个简单的射击效果呢,来跟我一起学习一下吧 射击元素: 枪口 枪口决定了一个子弹初始时的位置和方向,可以使用一个空物体来代替,放置在射出子弹的位置, 子弹 射击 ...
- Ruby‘s Adventrue游戏制作笔记(十一)Unity角色攻击——发射子弹
Ruby's Adventrue游戏制作笔记(十一)Unity角色攻击--发射子弹 前言 一.编辑子弹 二.创建脚本 三.修改玩家攻击脚本 四.将子弹拖入玩家脚本 五.让子弹碰撞到该碰撞的东西 六.编 ...
- Ruby‘s Adventrue游戏制作笔记(十四)Unity播放游戏音效
Ruby's Adventrue游戏制作笔记(十四)Unity播放游戏音效 前言 一.创建背景音乐 二.创建新的脚本 三.在其他需要播放的所有脚本中进行操作 四.给敌人添加音效 五.给玩家添加移动音效 ...
- Ruby‘s Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效
Ruby's Adventrue游戏制作笔记(十二)Unity给角色添加简单的特效 前言 一.把特效物品进行切割 二.创建 particle System 三.创建彩色球 四.再设置一下其他属性 五. ...
- Unity游戏优化指南大全(持续更新中!)
Unity游戏优化指南大全 三个官方优化提示: 性能和优化 (Performance and Optimization) - 关于性能分析器以及性能和优化技巧的 Unity 学习教程. Best pr ...
- 【笔记】Unity优化 基础知识
目录 Find 和 FindObjectOfType Camera.main 按 ID 寻址 与 UnityEngine.Object 子类进行 Null 比较 矢量和四元数数学以及运算顺序 使用非分 ...
最新文章
- 人脸识别未来发展如何更有“面子”?
- SqlServer修改数据库文件及日志文件存放位置
- 关于图像语义分割的总结和感悟
- 基于 EventBridge 构建 SaaS 应用集成方案
- 本地区间管理 oracle,Oracle:本地表空间管理,字典表空间管理
- 数据分析师的全景职业规划,入门、转行都先看这篇
- 您企业的邮件系统够安全吗
- 在 Linux 中安装 VMware Tools
- CSS3 炫酷简单动画 详解!
- CImage 设置任意像素的RGB值
- PHP生成腾讯云API签名
- 知言:《第一行代码》作者郭霖:不要成为工具的奴隶
- 基于反馈的动态补偿模型
- web前端学习(一):国内最常用,又优秀的web框架,Vue渐近式框架
- 微信无法连接到服务器的原因
- 财务人员的6大数据分析方法
- SAP上线时未清采购订单处理
- 台式计算机怎么截屏,台式电脑,怎么截图全屏?
- Java 中 == 与 equals 区别,再确认一遍?
- 入股联华马云新零售战略翻篇:最终要让电子商务成历史