3D平台控制器 - 以不同方向运行

时间:2018-04-02 19:51:23

标签: c# unity3d

我试图用超级马里奥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;
        }
    } 

}

1 个答案:

答案 0 :(得分:0)

我可能会建议使用“transform.forward”来确定动画面向的方向,并在运动中使用它。 (它基本上为您提供局部+ Z轴。)旋转将适当地改变它。如果你在不使用当前变换数据的情况下导出运动矢量,那么它通常是一个动画片的配方。