首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >3D平台控制器-不同方向运行

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

Stack Overflow用户
提问于 2018-04-02 19:51:22
回答 1查看 420关注 0票数 0

我正试图制作一个平台游戏与控制,如超级马里奥64,在那里,玩家可以使字符运行在不同的方向。我几乎已经用我现有的代码实现了这一点,但我需要相机能够更新字符模型,其中的方向是前进,后退等。现在,字符的模型可以改变方向运行时,相机在一个位置,它将看起来很好。但是如果我把相机转过来,模型就会朝着期望的方向运行,但是模型会在面对错误的方向时产生动画效果。有什么想法吗?我对编码非常陌生,并遵循了几个指南来实现这一点。

代码语言:javascript
运行
复制
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;
        }
    } 

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-04 20:04:56

我可能建议使用"transform.forward“来确定动画所面对的方向,并在运动中使用它。(它基本上给出了局部+Z轴。)轮换将适当地改变它。如果您在不使用当前转换数据的情况下导出运动矢量,则通常会产生不稳定的动画。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49617857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档