如何检测特定对象上的碰撞?

时间:2018-11-20 09:14:38

标签: c# user-interface unity3d

让我们假设场景中有两个带有红色和蓝色材料的圆柱体。另外,我们有两个具有红色和蓝色背景的UI图像。现在,我该怎么做才能使红色图像只能拖到红色圆柱上,而蓝色图像只能拖到蓝色圆柱上。
如果我将红色图像拖到蓝色圆柱上,则会出现错误消息:
相同,也可以在红色圆柱体上拖动蓝色图像,反之亦然。

看下面的图片

Example

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

public class wrench : MonoBehaviour {

    public bool Dragging = false;
    public bool collision = false;
    Vector3 position;
    public List<GameObject> UIimages;

    public void BeginDrag() {

        position = gameObject.transform.position;
        Dragging = true;
        foreach (GameObject obj in UIimages) {
            obj.GetComponent<BoxCollider2D> ().enabled = false;
        }
    }

    public void Drag() {
        transform.position = Input.mousePosition;
    }

    public void Drop() {
        if (!collision) {
            gameObject.transform.position = position;
        }
        Dragging = false;
    }
}

1 个答案:

答案 0 :(得分:0)

假设您说的话已经检测到您的dropps,问题更多的是关于如何使用简单的enum例如,

public enum WhichObject
{
    red,
    blue
}

优点是以后您可以非常轻松地添加更多选项,而不必处理图层,标签等。

在GameObject上拖动,添加一个组件,例如

public class ObjectInformation
{
    public WhichObject IsObject;
}

,只需在检查器中选择(或如果通过脚本生成它们)为每个WhichObject变量应具有的拖动对象。

除了在检测碰撞的目标对象上还添加一个WhichObject变量,但这一次配置您希望在此处放置的值

public WhichObject ExpectedObject;

再次通过检查器或脚本进行设置。

比简单地添加支票

var info = droppedObject.GetComponent<ObjectInformation>();

// Something else dropped?
if(!info) return;

// Now check if the value matches
// the one this object expects
if(info.IsObject == ExpectedObject)
{
    // Correct object
    Debug.Log("Yeah!");
} 
else 
{
    // Wrong object
    Debug.LogFormat("Dropped object {0} does not match the expected object {1}!", info.IsObject, ExpectedObject);
}

以后,您也可以简单地使用多个枚举来扩展它,例如颜色,形式等

也许您也可以反过来进行检查,然后检查所拖动的对象,如果值匹配,如果不匹配,甚至不允许将其放在该目标对象上(这当然取决于您的实现)。