【问题标题】:How to detect Collision on specific Object?如何检测特定对象上的碰撞?
【发布时间】:2018-11-20 09:14:37
【问题描述】:

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

见下图

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;
    }
}

【问题讨论】:

  • 你可以使用碰撞器和标签来检查它,你知道它们是如何工作的吗?
  • @Lotan 我知道,但我不知道在这种情况下如何使用它们,因为将来如果我的场景中有这么多对象,我将不得不为每个对象编写单独的单独脚本跨度>
  • @Lotan 拖动工作非常好我只希望红色只能在一个与蓝色相同的红色圆柱体上拖动
  • @Lotan 请检查我的问题我已经在这段代码中发布了代码我使用了禁用其他对象上所有对撞机的列表,但是如果我完成了拖动红色图像,如何重新启用它在红色圆柱上,然后我想在蓝色圆柱上拖动蓝色图像,但它无法检测到碰撞,因为它的对撞机被禁用
  • 对不起 Nouman 但我不明白你的意思,试着用不同的方式解释它^^'

标签: c# user-interface unity3d


【解决方案1】:

假设您所说的已经检测到您的 dropp,并且问题更多是关于如何区分对象之间的差异,我将使用简单的enum 例如

public enum WhichObject
{
    red,
    blue
}

优点是以后你可以很容易地添加更多选项,而不必处理层、标签等。

在您拖动的游戏对象上添加一个组件,例如

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);
}

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

也许你也可以反过来检查并检查拖动的对象,如果值匹配并且如果不匹配甚至不允许放置在该目标对象上(这当然取决于你的实现)。

【讨论】:

    猜你喜欢
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多