【推荐100个unity插件】Unity免费3D抛物线可视化工具,适合FPS和TPS塔防等预判渲染路径和着落点视觉效果——Projectile Curve Visualizer插件_curved unity插件下载 gitte
注意
:考虑到后续接触的插件会越来越多,我将插件相关的内容单独分开,并全部整合放在【推荐100个unity插件】专栏里,感兴趣的小伙伴可以前往逐一查看学习。
最终效果演示
文章目录
- 最终效果演示
- 前言
- 插件下载安装
- 使用介绍
-
- 1、创建“ProjectileCurveVisualizer”的实例
- 2、抛射曲线属性
- 3、抛体曲线材质
- 4、显示预测轨迹线
-
- 4.1 VisualizeProjectileCurve
- 4.2 VisualizeProjectileCurveWithTargetPosition
- 5、隐藏预测轨迹线
- 6、投掷投射物
- 专栏推荐
- 完结
前言
插件下载安装
https://assetstore.unity.com/packages/tools/physics/projectile-curve-visualizer-253878?aid=1100lpo99
使用介绍
1、创建“ProjectileCurveVisualizer”的实例
导航到 Assets\\ProjectileCurveVisualizer\\Prefabs 文件夹,将“ProjectileCurveVisualizer”预制体拖入场景
2、抛射曲线属性
在 ProjectileCurveVisualizer 脚本中主要关注 4 个可调节属性:
IgnoredLayers
忽略层: 要忽略的层。如果选中水层,投射物曲线将不会击中该层上的任何物体。CurveSubdivision
曲线细分: 数值越高,曲线越平滑。如果值为 100,曲线将有 100 个顶点(LineRenderer)。MaximumInAirTime
最大空中时间: 投射物最大飞行时间(秒)。如果值为 8,则渲染前 8 秒的轨迹,超过 8 的部分将被忽略。出于性能考虑,大多数情况下可以限制在 10 以下。DetectionInterval
检测间隔: 物理检测的频率(秒)。如果值为 0.25,则每 0.25 秒计算投射物位置,并进行 Raycast 检查两者之间是否有障碍物阻挡。限制此值可以节省一些性能。通常情况下,0.1 到 0.25 之间的值对大多数情况已经足够。
3、抛体曲线材质
曲线网格和命中目标网格的纹理和颜色都是可调节的,甚至可以根据个人喜好替换整个材质。类似地,实际抛体网格也可以进行定制。
材质和纹理位于 Assets\\ProjectileCurveVisualizer\\Mesh 和 Assets\\ProjectileCurveVisualizer\\Demo\\Mesh\\ProjectileCurves\\Materials。
默认情况下,LineRenderer 的 Texture Mode纹理模式
应为“Tile平铺
”以匹配 DashLine 材质,但也可以更改为“Stretch伸展
”以匹配不同材质的风格。LineRenderer 的宽度可以直接在 Inspector 面板上调整。
默认demo给出了三种演示效果,我们可以直接拿来使用
4、显示预测轨迹线
根据需要,可以调用“VisualizeProjectileCurve
”或“VisualizeProjectileCurveWithTargetPosition
”函数。如果曲线需要每帧计算,应将其放在 Update()方法或其他更新函数中。
4.1 VisualizeProjectileCurve
目标位置未知且发射速度可调。通常用于第一人称模式或第三人称模式。
ProjectileCurveVisualizer.VisualizeProjectileCurve(Vector3 projectileStartPosition, float projectileStartPositionForwardOffset,Vector3 launchVelocity, float projectileRadius, float distanceOffsetAboveHitPosition, bool debugMode, out Vector3 updatedProjectileStartPosition, out RaycastHit hit)
输入参数
projectileStartPosition
:投射物起点的世界位置。projectileStartPositionForwardOffset
:这将向目标位置添加一个偏移量。如果值是 100,实际投射物的起始位置将向前 100 单位。添加偏移量可以确保投射物不会太靠近角色,然后与角色发生碰撞。launchVelocity
:初始速度和方向。projectileRadius
:抛射体网格的半径。distanceOffsetAboveHitPosition
:这将向击中法线方向添加一个偏移量。用于目标网格(曲线末端的网格,带有目标图标纹理)。有时将目标网格与击中位置完全相同会导致Z-fighting
,给它一个小的偏移量可以解决这个问题。debugMode
:调试,显示抛射物曲线的 Raycast 路径。在场景视图中,Raycast 路径为绿色,命中法线为红色。、
输出参数
updatedProjectileStartPosition
:实际起始位置,结果为projectileStartPosition + ProjectileStartPositionForwardOffset。hit
:RaycastHit 的结果,包含如 hit.point 和 hit.hitNormal 等信息。
使用示例
private float launchSpeed = 10.0f;public ProjectileCurveVisualizer projectileCurveVisualizer;private Vector3 updatedProjectileStartPosition;private RaycastHit hit;void Start(){characterTransform = this.transform;}void Update(){projectileCurveVisualizer.VisualizeProjectileCurve(characterTransform.position, 1.0f, characterTransform.forward * launchSpeed, 0.25f, 0.1f,true, out updatedProjectileStartPosition, out hit);}
4.2 VisualizeProjectileCurveWithTargetPosition
已知目标位置,需要计算发射速度。通常用于俯视模式。
ProjectileCurveVisualizer.VisualizeProjectileCurveWithTargetPosition(Vector3 projectileStartPosition, float projectileStartPositionForwardOffset, Vector3 projectileEndPosition, float launchSpeed, Vector3 throwerVelocity, Vector3 targetObjectVelocity, float projectileRadius, float distanceOffsetAboveHitPosition, bool debugMode, out Vector3 updatedProjectileStartPosition, out Vector3 projectileLaunchVelocity, out Vector3 predictedTargetPosition, out RaycastHit hit)
输入参数
projectileStartPosition
:投射物起点的世界位置。projectileStartPositionForwardOffset
:这将向目标位置添加一个偏移量。如果值是 100,实际投射物的起始位置将向前 100 单位。添加偏移量可以确保投射物不会太靠近角色,然后与角色发生碰撞。projectileEndPosition
:要击中的目标位置。launchSpeed
:数值越大,可击中的位置越远。throwerVelocity
:投掷者的速度。如果投掷者静止不动,只需输入 Vector3.zero。速度需要手动计算,velocity = deltaDistance / Time.deltaTime。targetObjectVelocity
:目标物体的速度。如果目标静止不动,只需输入 Vector3.zero。同样,速度需要手动计算,velocity = deltaDistance / Time.deltaTime。projectileRadius
:抛射体网格的半径。distanceOffsetAboveHitPosition
:这将向击中法线方向添加一个偏移量。用于目标网格(曲线末端的网格,带有目标图标纹理)。有时将目标网格与击中位置完全相同会导致 Z-fighting,给它一个小的偏移量可以解决这个问题。debugMode
:调试,显示抛射物曲线的 Raycast 路径。在场景视图中,Raycast 路径为绿色,命中法线为红色。、
输出参数
updatedProjectileStartPosition
:实际起始位置,结果为projectileStartPosition + ProjectileStartPositionForwardOffset。- projectileLaunchVelocity:击中目标位置所需的必要速度。这个速度可用于投掷投射物。
predictedTargetPosition
:如果 throwerVelocity 或 targetObjectVelocity 不是 (0, 0, 0),它将根据速度信息预测下一刻可能的靶位。如果投掷者和靶都是静止的,则predictedTargetPosition 将会是精确的目标位置(无预测)。hit
:RaycastHit 的结果,包含如 hit.point 和 hit.hitNormal 等信息。
使用示例
private float launchSpeed = 10.0f;private Ray ray;private RaycastHit mouseRaycastHit;private bool canHitTarget = false;public ProjectileCurveVisualizer projectileCurveVisualizer;private Vector3 updatedProjectileStartPosition;private Vector3 projectileLaunchVelocity;private Vector3 predictedTargetPosition;private RaycastHit hit;void Start(){characterTransform = this.transform;}void Update(){if (Physics.Raycast(ray, out mouseRaycastHit)){canHitTarget = projectileCurveVisualizer.VisualizeProjectileCurveWithTargetPosition(characterTransform.position, 1.5f, mouseRaycastHit.point, launchSpeed,Vector3.zero, Vector3.zero, 0.05f, 0.1f, true, out updatedProjectileStartPosition, out projectileLaunchVelocity, out predictedTargetPosition, out hit);if(canHitTarget){// Throw}}}
5、隐藏预测轨迹线
当不需要时,调用“HideProjectileCurve
”函数来隐藏曲线。
projectileCurveVisualizer.HideProjectileCurve();
6、投掷投射物
插件其实默认给了一个可投射物,在Assets\\ProjectileCurveVisualizer\\Prefabs
文件夹中包含一个名为“Projectile”的预制体。
其实我们也可以自己制作一个,只需要给投射物添加Rigidbody、MeshCollider组件,并挂载Projectile脚本即可
要投掷投射物:
- 实例化一个名为“Projectile”的预制体,
- 将其位置设置为 updatedProjectileStartPosition,
- 然后从 Projectile 中调用“Throw”函数,并传递:使用
VisualizeProjectileCurve
函数时使用launchVelocity
或 使用VisualizeProjectileCurveWithTargetPosition
函数时使用projectileLaunchVelocity
。
示例:
using ProjectileCurveVisualizerSystem;using UnityEngine;/// /// 大炮射击控制系统/// public class CannonShooting : MonoBehaviour{ [Header(\"炮弹设置\")] [SerializeField, Tooltip(\"炮弹预制体\")] private GameObject cannonBall; [SerializeField, Tooltip(\"炮口位置参考点\")] private Transform muzzle; [Header(\"轨迹线\")] public ProjectileCurveVisualizer projectileCurveVisualizer; private float launchSpeed = 10.0f;//发射速度 private Vector3 updatedProjectileStartPosition; //实际起始位置 private RaycastHit hit; private Vector3 launchVelocity;//初始速度和方向 void Update() { launchVelocity = muzzle.forward * launchSpeed; projectileCurveVisualizer.VisualizeProjectileCurve( muzzle.position, 0f, launchVelocity, 0.25f, 0.1f, true, out updatedProjectileStartPosition, out hit ); // 空格键触发射击 if (Input.GetKeyDown(KeyCode.Space)) { Shoot(); } } /// /// 执行射击操作 /// private void Shoot() { // 生成一个投射物并移动到起始位置 Projectile projectile = GameObject.Instantiate(cannonBall).GetComponent<Projectile>(); projectile.transform.position = updatedProjectileStartPosition; // 投掷投射物 projectile.Throw(launchVelocity); }}
演示效果
专栏推荐
完结
好了,我是向宇
,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!