Unity3D角色连续移动问题 [英] Unity3D Character Continuously Moving Issue

查看:315
本文介绍了Unity3D角色连续移动问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我在Unity3D中从事一个项目,并且遇到以下问题:

so I'm working on a project in Unity3D and I'm having the following issue:

当我最初开始游戏时,角色没有移动,这是预期的.然后,当我按下"W"移动时,我的角色开始移动并进行动画处理.但是,当我松开钥匙时,她并没有停止前进.

When I initially start the game, the character is not moving, which is intended. Then, when I hit "W" to move, my character starts moving and animates. However, when I let off the key, she doesn't stop moving forward.

即使我按下"S"键向后移动,我放开后,她也会在没有按下任何键的情况下再次向前移动,对于我来说,我不知道为什么.

Even if I hit the "S" key to move backward, after I let up, she starts moving forward again while no keys are pressed, and for the life of me I can't figure out why.

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

Here's the script I'm using on her if that helps:

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.

I think the problem may be that I'm using controller.velocity.magnitude incorrectly.

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

If anyone can help me out, I would appreciate it!

推荐答案

我实际上已经弄清楚了.我的动画师没有设置任何过渡效果,因此角色被卡在动画中.

I actually figured it out. My animator didn't have one of the transitions set up, so the character was stuck in an animation.

谢谢!

这篇关于Unity3D角色连续移动问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆