【问题标题】:How to smooth the change of player's direction?如何平滑玩家方向的变化?
【发布时间】:2019-11-12 22:42:21
【问题描述】:

我想平滑玩家方向的变化。我有一个简单的动作脚本,但是当我前进并开始倒退时,我希望我的角色开始“滑动”。 gif 文件中有一个示例 - https://imgur.com/uSL1Gd1。我试过了,但是太疯狂了(

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Moving : MonoBehaviour
{
    [SerializeField]
    Transform frogTransform;
    Vector3 now = new Vector3();
    Vector3 Now
    {
        get
        {
            if (now == null)
            {
                return Vector3.zero;
            }
            else
            {
                return now;
            }
        }
    }

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.W))
        {
            now = Vector3.Lerp(now, Vector3.forward, 0.5f); //this doesn't help me (nothing changes)
            frogTransform.Translate(now * 0.1f);
            now = Vector3.forward;
        }
        else if (Input.GetKey(KeyCode.S))
        {
            now = Vector3.Lerp(now, Vector3.back, 0.5f);
            frogTransform.Translate(now * 0.1f);
            now = Vector3.back;
        }
        if (Input.GetKey(KeyCode.D))
        {
            now = Vector3.Lerp(now, Vector3.right, 0.5f);
            frogTransform.Translate(now * 0.1f);
            now = Vector3.right;
        }
        else if (Input.GetKey(KeyCode.A))
        {
            now = Vector3.Lerp(now, Vector3.left, 0.5f);
            frogTransform.Translate(now * 0.1f);
            now = Vector3.left;
        }
    }
}

【问题讨论】:

  • 如果与RigidBody 打交道,您根本不想使用transform.Translate。如果您想采用这种方式,请使用Rigidbody.MovePositionLerp0.5 作为因素只是意味着您将向量设置为当前向量和目标向量之间的中间的每一步......但实际上从未达到目标向量!
  • 我只是假设您在此处设置括号的方式是一个错字,对吧?还要注意 Vector3struct 并且默认情况下与 Vector3.zero 具有相同的值。它永远不会是 null 所以你的 if(now == null) (以及整个属性)是完全多余的
  • Vector3 中有一个函数叫做slerp,它是smooth lerp 的缩写。自从我在 Unity 工作以来已经有一段时间了,但我很确定如果你想像链接的 gif 一样移动,你不应该依赖刚体。如果您想要无物理运动,变换函数就足够了。

标签: c# unity3d math vector motion


【解决方案1】:

从您的回答中,我看到您正在使用 Transform.Translate,这不是应用 Unity Physics 的工具(并创建滑动效果)。

要应用幻灯片效果,您可以将Rigidbody 添加到您的游戏对象。

然后您可以使用Rigidbody.AddForce 来指导您的移动。

只要你改变方向/力量,你就会看到滑动效果。考虑一下您可以调整刚体的质量和阻力以获得不同类型的滑动效果。

你的代码会变成。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Moving : MonoBehaviour
{
    [SerializeField] Rigidbody rigidbody;

    [SerializeField] float accelerationForce = 5f;

    void FixedUpdate()
    {
        if (Input.GetKey(KeyCode.W))
            rigidbody.AddForce(Vector3.forward * accelerationForce, ForceMode.Impulse);

        if (Input.GetKey(KeyCode.S))
            rigidbody.AddForce(Vector3.back * accelerationForce, ForceMode.Impulse);

        if (Input.GetKey(KeyCode.D))
            rigidbody.AddForce(Vector3.right * accelerationForce, ForceMode.Impulse);

        if (Input.GetKey(KeyCode.A))
            rigidbody.AddForce(Vector3.left * accelerationForce, ForceMode.Impulse);
    }
}

您也可以查看this tutorialthis other tutorial

【讨论】:

  • 当我通过 WASD 移动我的角色时,我需要平滑地改变方向。当我的角色前进并且我开始按住S(后退)时,他不应该急剧后退,而是放慢速度并慢慢开始向后移动。
  • 这正是 RigidBody AddForce 会做的事情。
  • 但这不会让物体在停止后慢慢加快速度。
  • 如果您显示与您的实现相关的代码以及您在刚体中设置的值,我将检查那里发生了什么。您可以将其添加到问题中。 IE 尝试添加一个非常大的质量并将力用作 Impulse。
  • 我仍然确认解决方案。您使用的是 Transform.Translate 而不是 Rigidbody.AddForce。我使用刚体发送脚本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多