【问题标题】:Snapping game object to another game object in Unity 3D during runtime在运行时将游戏对象捕捉到 Unity 3D 中的另一个游戏对象
【发布时间】:2019-10-17 18:56:08
【问题描述】:

此时,我将我的游戏对象拖过屏幕;但是,我很难弄清楚如何让我的游戏对象捕捉到场景中预先存在的游戏对象。实例化后,如何在运行时将我的游戏对象捕捉到另一个对象?

public class DragObject : MonoBehaviour

{ 
    private Vector3 mOffset;
    private float mZCoord;

    void OnMouseDown()

    {
        mZCoord = Camera.main.WorldToScreenPoint(
        gameObject.transform.position).z;
        mOffset = gameObject.transform.position - GetMouseAsWorldPoint();
    }

    private Vector3 GetMouseAsWorldPoint()

    {
        Vector3 mousePoint = Input.mousePosition;
        mousePoint.z = mZCoord;
        return Camera.main.ScreenToWorldPoint(mousePoint);
    }

    void OnMouseDrag()

    {
        transform.position = GetMouseAsWorldPoint() + mOffset;
    }

}

LoadAssets类:

public class LoadAssets : MonoBehaviour
{

    bool isCreated = false;
    bool isCreatedDrillbit = false;

    public void LoadBOP()

    {
        if (!isCreated)

        {
            GameObject instance = Instantiate(Resources.Load("BOP", typeof(GameObject))) as GameObject;
            isCreated = true;
        }

    }

    public void LoadDrillBit()

    {
        if (!isCreatedDrillbit)

        {
            GameObject instance = Instantiate(Resources.Load("Drillbit", typeof(GameObject))) as GameObject;
            isCreatedDrillbit = true;
        }

    }

}

【问题讨论】:

  • 您希望它捕捉到这个游戏对象的确切位置?在它的对撞机上最近的位置?是transform.position?这个问题非常不清楚“捕捉到”的确切含义
  • 加载游戏对象时,我希望能够让该游戏对象连接到另一个游戏对象的顶部。例如,如果我有一个没有盖子的瓶子,我想装上一个盖子并将该盖子连接到瓶子的顶部。
  • 或者将直接连接到瓶子顶部的游戏对象拖动。加载后我可以拖动游戏对象,但我希望能够将其连接或捕捉到另一个游戏对象。我希望这是有道理的。

标签: c# unity3d gameobject


【解决方案1】:

编写一个脚本来检查其他对象的位置,如果它足够近,则将其设为自身的子对象,并将其本地位置和旋转设置为默认值。另外,禁用拖动脚本:

public class SnapToMe : MonoBehaviour
{

    public GameObject target = null;
    public float snapDistance = 1f; 

    void FixedUpdate() 
    {
        if (target==null) return;

        if ( Vector3.Distance(transform.position, target.transform.position) <= snapDistance) )  
        {
            target.transform.parent = transform;
            target.transform.localRotation = Quaternion.identity;
            target.transform.localPosition = Vector3.zero;

            target.GetComponent<DragObject>().enabled = false;
        }
    }
}

在您要进行捕捉的对象上,在应该发生捕捉的位置添加一个子对象,并将捕捉脚本附加到它:

Bottle
└── Bottle snap point
    └── SnapToMe

然后当你创建帽子时,告诉捕捉点:

Gameobject newCap = Instantiate(...);
Gameobject bottleSnapPoint = GameObject.Find(
        "Bottle snap point"); // or some other way to get a reference to the snap point

SnapToMe snapper = bottleSnapPoint.GetComponent<SnapToMe>();
snapper.target = newCap;
snapper.snapDistance = 2f; //whatever is appropriate

【讨论】:

  • 好的,我试试看。谢谢 Ruzihm!
  • 感谢 Ruzihm。感谢您的耐心和帮助!
  • Ruzihm,是否可以有一个通用的捕捉场景?例如,一旦我实例化了一个新的游戏对象,它将捕捉到正确的位置,但如果我实例化了第二个对象,它会将自身附加到相同的位置。如果我有多个游戏对象,我希望它能够捕捉到新创建的游戏对象的末尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
相关资源
最近更新 更多