首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Unity3D字符连续移动问题

Unity3D字符连续移动问题
EN

Stack Overflow用户
提问于 2014-08-02 15:53:59
回答 2查看 1.9K关注 0票数 0

因此,我正在Unity3D中进行一个项目,我有以下问题:

当我开始游戏时,角色并不是移动的,这是我想要的。然后,当我点击"W“移动,我的角色开始移动和动画。然而,当我松开钥匙时,她并没有停止前进。

即使我按下"S“键向后移动,在我放松后,她又开始向前移动,而没有按下键,而对于我的生活,我不知道为什么。

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

代码语言:javascript
运行
复制
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不正确。

如果有人能帮我,我会很感激的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-04 17:28:49

我真的想通了。我的动画师没有设置任何一个转换,所以角色被卡在动画中。

谢谢!

票数 0
EN

Stack Overflow用户

发布于 2014-08-03 14:02:07

这一行:

代码语言:javascript
运行
复制
moveDirection = transform.forward * vertDirection * speed; 

应该是这样:

代码语言:javascript
运行
复制
moveDirection = transform.forward * vertDirection * speed * Time.deltaTime;

其他区块:

代码语言:javascript
运行
复制
else
            controller.Move(moveDirection * Time.deltaTime);

应该是这样的:

代码语言:javascript
运行
复制
else
            controller.Move(Vector3.zero);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25096823

复制
相关文章

相似问题

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