微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在Unity中不移动任何一个对象的情况下碰撞两个对象

如何解决如何在Unity中不移动任何一个对象的情况下碰撞两个对象

我的 3D Unity 游戏中有一个类似于 this mockup 的设置。

每个对象都有一个碰撞器和一个刚体。我正在使用鼠标使用简单的鼠标输入事件移动对象

private void OnMouseDown()
    {
        isSelected = true;
    }

    private void OnMouseDrag()
    {
        if (!isSelected) return;
        Vector3 touchLocation = InputController.Instance.getTapLocation(); // Gets touch/mouse location using Raycast
        _transform.position = track.GetPositionOnPath(touchLocation); //Uses vector projection math
    }

    private void onmouseup()
    {
        if (isSelected)
            isSelected = false;
    }

使用矢量投影将对象移动限制为路径

public Vector3 GetPositionOnPath(Vector3 touchLocation)
    {
        //Make the vector for the track u
        Vector3 u = end.position - start.position;
        //Make the touch location vector from the track start position v
        Vector3 v = touchLocation - start.position;

        float uv = Vector3.Dot(u,v);
        float uMagSqr = Mathf.Pow(u.magnitude,2);
        Vector3 p = (uv / uMagSqr) * u; //Projection Formula (u.v)/(|u|^2) * u
        Vector3 finalVector = start.position + p;

        //Clamp the final vector to the end.positions of the track
        if (start.position.x > end.position.x)
            finalVector.x = Mathf.Clamp(finalVector.x,end.position.x,start.position.x);
        else
            finalVector.x = Mathf.Clamp(finalVector.x,start.position.x,end.position.x);
        if (start.position.z > end.position.z)
            finalVector.z = Mathf.Clamp(finalVector.z,end.position.z,start.position.z);
        else
            finalVector.z = Mathf.Clamp(finalVector.z,start.position.z,end.position.z);

        return finalVector;
    }

我想让其他物体挡住所选物体的移动,如模型所示。我想到的解决方案是增加物体的重量,使它们在碰撞时不会飞走,或者保持除当前选定的物体之外的每个物体的运动学。但它们都存在相同的问题,即对象只是相互滑动。

这似乎是一件简单的事情,但我似乎找不到任何资源来帮助我。我真的很感激在如何解决这个问题和按照我的意图实施机制方面的一些帮助。提前致谢。

解决方法

我还没有找到我正在寻找的确切解决方案。但由于强烈不鼓励移动刚体对象的位置,因此我根据在 thisthis 线程上找到的信息切换到基于物理的运动。这是我目前的实现:

private void OnMouseDown()
    {
        isSelected = true;
        _rigidbody.isKinematic = false;
    }

    private void OnMouseDrag()
    {
        if (!isSelected) return;
        Vector3 target = InputController.Instance.getTapLocation();
        //_rigidbody.MovePosition(target);
        force = _track.GetPositionOnPath(target) - _transform.position;
    }

    private void OnMouseUp()
    {
        if (!isSelected) return;
        isSelected = false;
        _rigidbody.isKinematic = true;
        force = Vector3.zero;
    }

    private void FixedUpdate()
    {
        _rigidbody.velocity = force;
    }

然而,这样做的代价是移动不能完全响应玩家给出的输入,如 gif 所示。

这是一个修复,所以我将此作为答案发布,但非常感谢任何其他更好的选择。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?