Unity3D角色不断移动的问题

时间:2014-08-02 15:53:59

标签: c# unity3d game-physics

所以我正在Unity3D的一个项目上工作,我遇到了以下问题:

当我最初开始游戏时,角色不会移动,这是预期的。然后,当我点击" W"移动,我的角色开始移动和动画。但是,当我放开钥匙时,她不会停止前进。

即使我击中" S"向后移动的关键,在我放松之后,她开始向前移动而没有按下按键,对于我的生活,我无法弄清楚原因。

这是我在她身上使用的脚本,如果有帮助的话:

using UnityEngine;
using System.Collections;

public class PlayerScript : MonoBehaviour 
{
    private CharacterController controller;
    public float speed = 20.0f;
    private Vector3 moveDirection = Vector3.zero;
    public float gravity = 20.0f;

    private bool winState = false;
    private bool loseState = false;

    private bool isBlocking = false;



    private Animator anim;

    // Use this for initialization
    void Start () 
    {


        controller = this.GetComponent<CharacterController>();
        anim = GetComponent<Animator>();
        anim.SetBool("Ready_Bool", true);
    }

    // Update is called once per frame
    void FixedUpdate ()
    {
        //GameObject center = GameObject.Find("MiddleOfRing");
        GameObject opponent = GameObject.Find("Opponent");

        checkAnimations();

        float turn = Input.GetAxis("Horizontal");

        //print("Horizontal: " + turn);

        if(turn < 0)
            moveLeft();
        else if(turn > 0)
            moveRight();

        float vertDirection = Input.GetAxis("Vertical");

        //print ("Vertical: " + vertDirection);

        print ("Controller Velocity: " + controller.velocity.magnitude); //for testing

        if(controller.isGrounded)
        {
            moveDirection = transform.forward * vertDirection * speed;  

            anim.SetFloat("Speed", controller.velocity.magnitude);
        }

        if(vertDirection > 0)
            moveForward(moveDirection);
        else if(vertDirection < 0)
            moveBackward(moveDirection);
        else
            controller.Move(moveDirection * Time.deltaTime);

        moveDirection.y = moveDirection.y - gravity * Time.deltaTime;



        transform.LookAt(opponent.transform.position);

        opponent.transform.LookAt(this.transform.position);




}


    void moveLeft()
    {

        GameObject opponent = GameObject.Find("Opponent");

        transform.RotateAround(opponent.gameObject.transform.position, Vector3.up, speed/2 * Time.deltaTime);

        //for testing purposes, to be replaced with actual AI
        opponent.transform.RotateAround(transform.position, Vector3.up, speed/2 * Time.deltaTime);

    //tells Animator character is moving left
        anim.SetBool("MoveLeft_Bool", true);
        anim.SetBool("MoveRight_Bool", false);
        anim.SetBool("MoveForward_Bool", false);
        anim.SetBool("MoveBackward_Bool", false);
    }

    void moveRight()
    {
        GameObject opponent = GameObject.Find("Opponent");

        transform.RotateAround(opponent.gameObject.transform.position, Vector3.down, speed/2 * Time.deltaTime);

        //for testing purposes, to be replaced with actual AI
        opponent.transform.RotateAround(transform.position, Vector3.down, speed/2 * Time.deltaTime);

        //tells Animator character is moving right
        anim.SetBool("MoveRight_Bool", true);
        anim.SetBool("MoveLeft_Bool", false);
        anim.SetBool("MoveForward_Bool", false);
        anim.SetBool("MoveBackward_Bool", false);
     }

    void moveForward(Vector3 move)
    {
        GameObject opponent = GameObject.Find("Opponent");

        float distance = Vector3.Distance(this.transform.position, opponent.transform.position);

        //keeps characters at a certain distance from each other
        if(distance >= 3)
        {   
            controller.Move(move * Time.deltaTime);
        }

        //tells Animator character is moving forward
        anim.SetBool("MoveForward_Bool", true);
        anim.SetBool("MoveRight_Bool", false);
        anim.SetBool("MoveLeft_Bool", false);
        anim.SetBool("MoveBackward_Bool", false);
    }

    void moveBackward(Vector3 move)
    {
        GameObject opponent = GameObject.Find("Opponent");

        moveDirection = transform.forward * Input.GetAxis("Vertical") * speed;

        controller.Move(move * Time.deltaTime);

        //tells Animator character is moving backward
        anim.SetBool("MoveBackward_Bool", true);
        anim.SetBool("MoveRight_Bool", false);
        anim.SetBool("MoveForward_Bool", false);
        anim.SetBool("MoveLeft_Bool", false);
    }

    void checkAnimations()
    {
        AnimatorStateInfo stateInfo = anim.GetCurrentAnimatorStateInfo(0);

        if(Input.GetKeyDown(KeyCode.E))
        {
            anim.SetTrigger("JabR_Trig");
            checkHit();
            isBlocking = false;
        }
        else if(Input.GetKeyDown(KeyCode.Q))
        {
            anim.SetTrigger("JabL_Trig");
            checkHit();
            isBlocking = false;
        }
        else if(Input.GetKey(KeyCode.B))
        {
            anim.SetTrigger("Block_Trig");
            isBlocking = true;
        }
        else
        {
            isBlocking = false;
        }



}

    void checkHit()
    {
         GameObject opponent = GameObject.Find("Opponent");

        float distance = Vector3.Distance(this.transform.position, opponent.transform.position);

        if(distance <= 4.0f)
        {

        }

    }


    public bool getBlocking()
    {
        return isBlocking;
    }



}

我认为问题可能是我错误地使用controller.velocity.magnitude

如果有人可以帮助我,我将不胜感激!

2 个答案:

答案 0 :(得分:0)

这一行:

moveDirection = transform.forward * vertDirection * speed; 

应该是这样的:

moveDirection = transform.forward * vertDirection * speed * Time.deltaTime;

这个阻止:

else
            controller.Move(moveDirection * Time.deltaTime);

应如下所示:

else
            controller.Move(Vector3.zero);

答案 1 :(得分:0)

我实际上已经明白了。我的动画师没有设置其中一个过渡,因此角色被卡在动画中。

谢谢!