如何将跳跃应用于控制器和播放器,以实现无尽的转轮3D统一

时间:2016-06-17 18:36:12

标签: c# animation unity5

我试图在团结中开发3D无尽的亚军游戏。我面临的问题是跳跃。如何应用跳跃到无尽的跑步者?我一直在互联网上搜索和浏览,没有运气。我确实找到了一些代码,但是当我尝试应用它们时,它们并没有起作用。另外如何调整角色控制器以使用动画?真的很感激帮助。

这是playerMotor.cs代码。

    private Vector3 moveVector;
    private float verticalVelocity = 0.0f;
    private float gravity = 12.0f;
    private float jumpPower = 15.0f;
    private bool jump;

    private float animationDuration = 3.0f;
    private float startTime;
    private Animator anim; 
    private CharacterController controller;

void Start()
    {
        controller = GetComponent<CharacterController>();
        anim = GetComponent<Animator>();
        startTime = Time.time;
    }

void Update()
    {

        if (Time.time - startTime < animationDuration)
        {
            controller.Move(Vector3.forward * speed * Time.deltaTime);
            return;
        }
        moveVector = Vector3.zero;

        if (controller.isGrounded)
        {
           verticalVelocity = -0.5f;
            if (Input.GetButton("Jump"))
            {
                verticalVelocity = jumpPower;
                anim.SetBool("Jump", true);
            }
            //anim.SetBool("Jump", false);       

        }
        else
        {
            verticalVelocity -= gravity * Time.deltaTime;

        }

        // X - Left and Right
        moveVector.x = Input.GetAxisRaw("Horizontal") * speed;
        anim.SetFloat("Turn", moveVector.x);

        if (Input.GetMouseButton(0))
        {
            //Are we holding touch on the right side?
            if (Input.mousePosition.x > Screen.width / 2)
            {
                moveVector.x = speed;
            }
            else
            {
                moveVector.x = -speed;
            }
        }

        //// Y - Up and Down
        //if (Input.GetButtonDown("Jump"))
        //{
        //    moveVector.y = verticalVelocity;
        //}

        // Z - Forward and Backward
        moveVector.z = speed;

        controller.Move(moveVector * Time.deltaTime);
}

我用来实现的代码如下所示。

function PlayerController(){
         var controller : CharacterController = GetComponent(CharacterController);
         moveDirection = Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
         moveDirection = transform.TransformDirection(moveDirection);
         moveDirection *= speed;
         if (controller.isGrounded) {
             vSpeed = -1;
             if (Input.GetButtonDown ("Jump")) {
                 vSpeed = jumpSpeed;
             }
         }
         vSpeed -= gravity * Time.deltaTime;
         moveDirection.y = vSpeed;
         controller.Move(moveDirection * Time.deltaTime);
}

我已经为正常的RPG角色应用了跳跃,但这个比我想象的要难。

2 个答案:

答案 0 :(得分:1)

从您的评论看来,您的实际问题似乎是&#34; controller.isGrounded&#34;从不打算,对吗? 我描述了与动画相关的评论(anim.SetBool("Jump", false);)中的第一个问题。
第二个问题来自您的PlayerController代码。

你&#34;重置&#34;你刚刚跳过的框架之后设置vSpeed = -1;的跳跃。所以从技术上来说,引擎甚至没有时间对跳跃做出反应,因为下一帧的角色很难被拉回地面(通过你实施的&#34;反跳&#34; :)。

我建议的是,从CharacterController.Move获取示例代码,就像您在应用更改之前所做的那样,但这次不能改变它!
只需将代码段复制粘贴到您的应用中并进行测试即可。在您按原样运行之后,再次,在没有任何代码更改的情况下,添加所需的自定义项,逐个并在每次更改时引入更改(bug)。

我还建议你在编码时开始使用Debug.Log(),这样你就可以过滤掉现在的问题,就像你和#39;看看代码中发生了什么&#34;动态&#34;,当你进行游戏测试时(.Log变量值带注释,如果&#34;分支&#34;当他们勾选时,计算值,调用重要的功能 - 如.Move() - 等)。

我希望这有帮助!干杯!

答案 1 :(得分:0)

我终于找到了问题的答案。感谢马克给你的建议,这对我帮助很大。

所以这就是我做的跳跃和跳跃动画。另请注意,我发布了正确而不是整个代码的内容,因为我在脚本的其余部分中未发现任何其他错误。

        moveVector = Vector3.zero;

        if (controller.isGrounded) //Check whether are we ground
        {

            verticalVelocity = -0.5f; //Just to make sure that we are ground
            if (Input.GetButton("Jump"))
            {

                verticalVelocity = 10f; //Basically this is the Jump power to Player
                anim.SetBool("Jump", true); //Jump animation to true
            }
        }
        else
        {
            verticalVelocity -= gravity * speed * Time.deltaTime; //Apply gravity
            anim.SetBool("Jump", false); //Set jump animation to false to stop looping continuously 
        }

//... the rest

这是我自己的代码。谢谢你帮助Mark。也欢呼你。