Unity3D 刚体 MovePosition 抖动。

3
我目前正在制作一个使用Unity的点击移动游戏。 当我在地图上单击某个位置时,我会将该鼠标单击设置为目的地,然后使用gameobject上的rigidBody使用RigidBody.MovePosition()移动它。当我这样做时,当gameobject到达其目的地时,我会出现很多闪烁。感谢任何帮助。谢谢。
    // 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);

     }
}

你的目标是一个点,因此很难到达*完全相同的位置。当你的目标非常接近你的对象时,你应该添加一些代码来处理这种情况。 - Greg
1
谢谢。这对我有用。简单易行的修复。非常感谢。 - user3623692
2个回答

1
我使用临时关节来执行这些动作。它们非常精确/可配置/可嵌入。
在2D中,我使用DistanceJoint2D来控制刚体点之间或刚体和世界点之间的距离。在3D中,您可以使用SpringJointConfigurableJoint
然后,基本上与您现在每帧移动的方式相同(在FixedUpdate上),Tween距离即可。

0
使用基于速度的行为时,很难达到一个点,并且经常会导致闪烁:这是因为对象总是经过目标位置。
解决方法是在物体接近目标时停止移动。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接