前言
如果我们视角移动转向,武器如果不跟着进行摇摆,会感觉我们的动作很生硬,特别是射击类游戏,如下
实现武器摇摆这里主要分享两种实现方法,一种是改变武器位置,一种是修改武器旋转
方法一、改变武器位置
public class WeaponSway : MonoBehaviour { /* 摇摆的参数 */ public float amount; // 摇摆幅度 public float smoothAmount; // 平滑值 public float maxAmount; // 最大摇摆幅度 private Vector3 originalPosition; // 初始位置 void Start() { // 自身位置(相对于父级物体变换得位置) originalPosition = transform.localPosition; } void Update() { // 设置武器手臂模型位置的值,(鼠标反转) float movementX = -Input.GetAxis("Mouse X") * amount; float movementY = -Input.GetAxis("Mouse Y") * amount; // 限制摇摆范围 movementX = Mathf.Clamp(movementX, -maxAmount, maxAmount); movementY = Mathf.Clamp(movementY, -maxAmount, maxAmount); Vector3 finalPosition = new Vector3(movementX, movementY, 0); // 手柄位置变换 transform.localPosition = Vector3.Lerp(transform.localPosition, finalPosition + originalPosition, Time.deltaTime * smoothAmount); } }
挂载配置参数
效果
方法二、改变武器旋转
public class WeaponSway2 : MonoBehaviour { public float amount; // 摇摆幅度 public float smooth; // 平滑度 private void Update() { // 获取鼠标输入 float mouseX = Input.GetAxisRaw("Mouse X") * amount; float mouseY = Input.GetAxisRaw("Mouse Y") * amount; // 计算目标旋转 Quaternion rotationX = Quaternion.AngleAxis(-mouseY, Vector3.right); Quaternion rotationY = Quaternion.AngleAxis(mouseX, Vector3.up); Quaternion targetRotation = rotationX * rotationY; // 旋转 transform.localRotation = Quaternion.Slerp(transform.localRotation, targetRotation, smooth * Time.deltaTime); } }
挂载配置参数
效果
结语
想要使用哪种方法都可以,看你自己喜欢,如果是我,我会选择第二种,比较简单,参数也少,而且个人感觉效果也更好,已枪中心做旋转更符合现实。