我试图用超级马里奥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;
}
}
}
答案 0 :(得分:0)
我可能会建议使用“transform.forward”来确定动画面向的方向,并在运动中使用它。 (它基本上为您提供局部+ Z轴。)旋转将适当地改变它。如果你在不使用当前变换数据的情况下导出运动矢量,那么它通常是一个动画片的配方。