我正试图制作一个平台游戏与控制,如超级马里奥64,在那里,玩家可以使字符运行在不同的方向。我几乎已经用我现有的代码实现了这一点,但我需要相机能够更新字符模型,其中的方向是前进,后退等。现在,字符的模型可以改变方向运行时,相机在一个位置,它将看起来很好。但是如果我把相机转过来,模型就会朝着期望的方向运行,但是模型会在面对错误的方向时产生动画效果。有什么想法吗?我对编码非常陌生,并遵循了几个指南来实现这一点。
static Animator anim;
public bool walking;
public GameObject playerModel;
//Transforms
public Transform playerCam, character, centerPoint;
//character controller declaration
CharacterController player;
//Mouse Rotation
private float rotX, rotY;
//Mouse Y Position
public float mouseYPosition = 1f;
//Mouse Sensitivity
public float Sensitivity = 10f;
//Mouse Zoom
private float zoom;
public float zoomSpeed = 2;
//Clamping Zoom
public float zoomMin = -2f;
public float zoomMax = -10f;
public float rotationSpeed = 5f;
//Move Front Back left & Right
private float moveFB, moveLR;
//Movement Speed
public float Speed = 2f;
//Velocity of Gravity
public float verticalVelocity;
//Jump Distance
public float jumpDist = 5f;
//Multiple Jumps
int jumpTimes;
// Use this for initialization
void Start ()
{
//character controller
player = GameObject.Find("Player").GetComponent<CharacterController> ();
anim = GetComponent<Animator>();
//mouse zoom
zoom = -3;
centerPoint.transform.position = playerCam.transform.position;
centerPoint.transform.parent = null;
}
// Update is called once per frame
void Update ()
{
//Mouse Zoom Input
zoom += Input.GetAxis ("Mouse ScrollWheel") * zoomSpeed;
if (zoom > zoomMin)
zoom = zoomMin;
if (zoom < zoomMax)
zoom = zoomMax;
//Mouse Camera Input
playerCam.transform.localPosition = new Vector3 (0, 0, zoom);
//Mouse Rotation
rotX += Input.GetAxis ("Mouse X") * Sensitivity;
rotY -= Input.GetAxis ("Mouse Y") * Sensitivity;
//Clamp Camera
rotY = Mathf.Clamp (rotY, -60f, 60f);
playerCam.LookAt (centerPoint);
centerPoint.localRotation = Quaternion.Euler (rotY, rotX, 0);
character.localRotation = Quaternion.Euler(0, rotX, 0);
//Movement Speed
moveFB = Input.GetAxis ("Vertical") * Speed;
moveLR = Input.GetAxis ("Horizontal") * Speed;
//Movement Direction
Vector3 movement = new Vector3 (moveLR, verticalVelocity, moveFB);
//Movement Rotation
movement = character.rotation * movement;
player.Move (movement * Time.deltaTime);
centerPoint.position = new Vector3 (character.position.x, character.position.y + mouseYPosition, character.position.z);
//Movement Input
if (Input.GetAxis ("Vertical") != 0 || Input.GetAxis ("Horizontal") != 0)
{
Quaternion turnAngle = Quaternion.LookRotation(new Vector3(moveLR, 0 ,moveFB));
playerModel.transform.rotation = Quaternion.Slerp (playerModel.transform.rotation, turnAngle, Time.deltaTime * rotationSpeed);
anim.SetBool("isWalking",true);
}
else
{
anim.SetBool("isWalking",false);
}
if (player.isGrounded == true)
{
jumpTimes = 0;
verticalVelocity = -Physics.gravity.y * Time.deltaTime;
}
else
{
verticalVelocity += Physics.gravity.y * Time.deltaTime;
}
if (jumpTimes < 1)
{
//Jump Input
if (Input.GetButtonDown ("Jump"))
{
verticalVelocity += jumpDist;
//print("I'm jumping.");
anim.SetTrigger("isJumping");
//set jumptimes +1
jumpTimes += 1;
}
}
}发布于 2018-04-04 20:04:56
我可能建议使用"transform.forward“来确定动画所面对的方向,并在运动中使用它。(它基本上给出了局部+Z轴。)轮换将适当地改变它。如果您在不使用当前转换数据的情况下导出运动矢量,则通常会产生不稳定的动画。
https://stackoverflow.com/questions/49617857
复制相似问题