【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
2024-01-09 16:33:10
前言
添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果,在本文中,将实现如何使用一些简单的代码实现武器摇摆和摆动效果,这比设置动画来尝试实现类似效果要容易得多。
开始
新增SwayNBobScript代码
using UnityEngine;
// 武器摆动脚本
public class SwayNBobScript : MonoBehaviour
{
[Header("Sway")]
public float step = 0.01f; // 摆动步长
public float maxStepDistance = 0.06f; // 最大步长距离
Vector3 swayPos; // 摆动位置
[Header("Sway Rotation")]
public float rotationStep = 4f; // 摆动旋转步长
public float maxRotationStep = 5f; // 最大旋转步长
Vector3 swayEulerRot; // 摆动旋转角度
public float smooth = 10f; // 平滑移动速度
float smoothRot = 12f; // 平滑旋转速度
[Header("Bobbing")]
public float speedCurve; // 速度曲线参数
float curveSin { get => Mathf.Sin(speedCurve); } // 曲线正弦值
float curveCos { get => Mathf.Cos(speedCurve); } // 曲线余弦值
public Vector3 travelLimit = Vector3.one * 0.025f; // 移动限制
public Vector3 bobLimit = Vector3.one * 0.01f; // 摆动限制
Vector3 bobPosition; // 摆动位置偏移量
public float bobExaggeration; // 摆动夸张系数
[Header("Bob Rotation")]
public Vector3 multiplier; // 摆动旋转系数
Vector3 bobEulerRotation; // 摆动旋转角度
void Update()
{
GetInput();
Sway();
SwayRotation();
BobOffset();
BobRotation();
CompositePositionRotation();
}
Vector2 walkInput; // 行走输入
Vector2 lookInput; // 视角输入
// 获取输入
void GetInput()
{
walkInput.x = Input.GetAxis("Horizontal");
walkInput.y = Input.GetAxis("Vertical");
walkInput = walkInput.normalized;
lookInput.x = Input.GetAxis("Mouse X");
lookInput.y = Input.GetAxis("Mouse Y");
}
// 摆动
void Sway()
{
Vector3 invertLook = lookInput * -step;
invertLook.x = Mathf.Clamp(invertLook.x, -maxStepDistance, maxStepDistance);
invertLook.y = Mathf.Clamp(invertLook.y, -maxStepDistance, maxStepDistance);
swayPos = invertLook;
}
// 摆动旋转
void SwayRotation()
{
Vector2 invertLook = lookInput * -rotationStep;
invertLook.x = Mathf.Clamp(invertLook.x, -maxRotationStep, maxRotationStep);
invertLook.y = Mathf.Clamp(invertLook.y, -maxRotationStep, maxRotationStep);
swayEulerRot = new Vector3(invertLook.y, invertLook.x, invertLook.x);
}
// 合成位置和旋转部分
void CompositePositionRotation()
{
transform.localPosition = Vector3.Lerp(transform.localPosition, swayPos + bobPosition, Time.deltaTime * smooth);
transform.localRotation = Quaternion.Slerp(transform.localRotation, Quaternion.Euler(swayEulerRot) * Quaternion.Euler(bobEulerRotation), Time.deltaTime * smoothRot);
}
// 摆动偏移
void BobOffset()
{
speedCurve += Time.deltaTime * (MovementScript.Instance.isGround ? (Input.GetAxis("Horizontal") + Input.GetAxis("Vertical")) * bobExaggeration : 1f) + 0.01f;
bobPosition.x = (curveCos * bobLimit.x * (MovementScript.Instance.isGround ? 1 : 0)) - (walkInput.x * travelLimit.x);
bobPosition.y = (curveSin * bobLimit.y) - (Input.GetAxis("Vertical") * travelLimit.y);
bobPosition.z = -(walkInput.y * travelLimit.z);
}
// 摆动旋转
void BobRotation()
{
bobEulerRotation.x = (walkInput != Vector2.zero ? multiplier.x * (Mathf.Sin(2 * speedCurve)) : multiplier.x * (Mathf.Sin(2 * speedCurve) / 2));
bobEulerRotation.y = (walkInput != Vector2.zero ? multiplier.y * curveCos : 0);
bobEulerRotation.z = (walkInput != Vector2.zero ? multiplier.z * curveCos * walkInput.x : 0);
}
}
代码挂载在武器父类上即可
正常情况下,我们还要实现武器在瞄准时,减低或者禁用武器摆动效果,可以选择在瞄准时启动和禁用SwayNBobScript脚本
public SwayNBobScript swayNBobScript;
private void Update()
{
DetermineAim();
}
//瞄准
void DetermineAim(){
swayNBobScript.enabled = true;
if (Input.GetMouseButton(1)){
swayNBobScript.enabled = false;
}
}
效果
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。当然如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,最近开始自学unity,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!php是工作,unity是生活!如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
文章来源:https://blog.csdn.net/qq_36303853/article/details/135398719
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!