【问题标题】:Unity3D RigidBody MovePosition FlickerUnity3D刚体移动位置闪烁
【发布时间】:2017-05-13 23:30:43
【问题描述】:

我目前正在开发一款在 Unity 中使用点击移动的游戏。当我点击地图上的一个点时,我将鼠标点击设置为目标,然后使用游戏对象上的刚体通过 RigidBody.MovePosition() 移动它。当我这样做时,当游戏对象到达目的地时,我会得到很多闪烁。任何帮助表示赞赏。谢谢。

    // COMPONENTS
Rigidbody rigidBody;

// MOVEMENT
Vector3 destination;
Vector3 direction;

// Use this for initialization
void Start()
{
    rigidBody = GetComponent<Rigidbody>();
    destination = transform.position;
}

// Update is called once per frame
void Update()
{
    DetectInput();
}

void FixedUpdate()
{
    MoveControlledPlayer();
}

void MoveControlledPlayer()
{

    transform.LookAt(destination);
    Vector3 direction = (destination - transform.position).normalized;
    rigidBody.MovePosition(transform.position + direction * 5 * Time.deltaTime);
}

void DetectInput()
{
   if (Input.GetMouseButton(0))
    {
        SetDestination();
    }
}

void SetDestination()
{
    if (!EventSystem.current.IsPointerOverGameObject())
    {
    Plane field = new Plane(Vector3.up, transform.position);
    Ray ray;
    float point = 0;

    ray = Camera.main.ScreenPointToRay(Input.mousePosition);

    if (field.Raycast(ray, out point))
        destination = ray.GetPoint(point);

     }
}

【问题讨论】:

  • 您的目的地是一个点。所以很难达到确切相同的位置。当您的目的地离您的对象非常非常近时,您应该添加一些代码来管理案例。
  • 谢谢。这对我有用。简单易修复。非常感谢。

标签: c# unity3d unity5 rigid-bodies


【解决方案1】:

我用临时关节做这些动作。它们非常准确/可配置/可嵌入。

在 2D 中,我使用 DistanceJoint2D 来控制刚体点之间或实体和世界点之间的距离。在 3D 中,您可以使用 SpringJointConfigurableJoint

然后只是补间距离,基本上与您现在每帧移动的方式相同(在FixedUpdate上)。

【讨论】:

    【解决方案2】:

    在使用基于速度的行为时到达一个点非常困难,并且经常会导致闪烁:这是因为对象总是经过他的目的地。

    解决它的一种方法是在对象足够靠近目标时停止移动。

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      相关资源
      最近更新 更多