在Unity

时间:2017-09-01 18:02:37

标签: c# unity3d collision-detection

我不知道如何解决这个难题。我将在下面逐步描述一个简单的场景。

  1. 我有一个小圆形精灵和三个以上的矩形精灵,每个都有不同的颜色,例如。红色,黄色,蓝色
  2. 在每个游戏对象上,我附上了一个盒子对撞机并使其触发。
  3. 当一个圆形由单个精灵触发或者它单独通过任何矩形精灵时,它将采用该精灵的颜色。(这很容易NP我们将在TriggerEnter上进行)
  4. 当圆圈同时穿过两个矩形精灵时,它将采用另一种颜色,如两种颜色的组合。 (这是我被卡住的地方,如何识别圆圈,两个矩形在同一点碰撞?)。
  5. 我曾经使用过Bounds,但没有得到确切的碰撞区域。我使用了一个游戏对象列表,并在TriggerEnter或TriggerStay上添加了游戏对象,并在TriggerExit上删除了它(在删除它之前改变了触发器退出的颜色)但没有得到确切的解决方案。

        //for simplicity consider there or only circle and colours rectangle. 
        //it will work for only two simultaneous trigger but i need more than that
        List<GameObject> go = new List<GameObject> ();
        public void OnTriggerEnter (Collider other)
        {
           if(!go.Contains(other.GameObject))
             go.Add(other.gameObject);
        }
    
        public void OnTriggerExit(Collider other)
        {
          // Changing colour according to list 
          if(go.Contains (other.gameObject)
          {
             go.Remove(other.gameObject);
          }
        }
    

    帮我解决这个简单的伎俩。

    由于

2 个答案:

答案 0 :(得分:1)

您帖子上的原始评论是正确的,涉及在列表中添加对撞机的解决方案应该有效,如果不适合您,那么您的代码可能会出错。

话虽如此,还有另一种检测多次碰撞的方法,可以使用Physics(或用于Physics2D)类的2D游戏来完成。在您的情况下,您提到了圆形和矩形,因此这些特定形状的函数是Physics2D.OverlapCircleAllPhysics2D.OverlapBoxAll

这些函数返回碰撞列表,然后您可以通过访问它们的gameObject变量来获取数据,还有许多其他形状可以与这些函数一起使用,您可以通过查看文档页面来查看它们对于物理课程。

Physics Class Documentation

Physics2D Class Documentation

答案 1 :(得分:1)

我将为您描述的情景提供解决方案。

让我们想象一下,我们只有3种类型的正方形,红色,蓝色和黄色。我要做的就是给每个人2的价值。例如:

int valueRed = 1; //2^0 
int valueBlue = 2; //2^1 
int valueYellow = 4; //2^2 

然后我会声明3个计数器,每种颜色一个(最初都是0):

int counterRed = 0;
int counterBlue = 0;
int counterYellow = 0;

这个计数器是必要的,所以如果圆圈与a碰撞不止一次 特定类型的正方形,它不会添加两次甚至更多次的颜色(这会破坏一切)

我将声明一个变量来设置圆的颜色

int circleColour;

我将使用不同的标签标记每个矩形,具体取决于其颜色:红色,蓝色,黄色。

现在在TriggerEnter中,我已经为你工作了,我会为每种颜色写这样的东西:

void OnTriggerEnter2D(Collider2D other) {
        if(other.tag == "Blue"){
            if(counterBlue == 0)
              {  circleColour += valueBlue;}
            counterBlue++;
        }
        //Same for the other 2 colours
    }

对于onTriggerExit:

void OnTriggerExit2D(Collider2D other) {
        if(other.tag == "Blue"){
            counterBlue--;
            if(counterBlue == 0 )
                circleColour -= valueBlue;
        }
        //Same for the other 2 colours
    }

通过这种方式,您将获得每种颜色组合的唯一值:

Red = 1;
Blue = 2; 
Purple = 3; //Red + Blue
Yellow = 4; 
Orange = 5; //Red + Yellow
Green = 6; // Blue + Yellow
Black = 7; // Red + Blue + Yellow

然后,您可以使用开关

以编程方式为您的圆圈设置正确的颜色
switch(circleColour){
   case 1: //Set color of the circle sprite to red; 
   break;
   case 2: //Set color of the circle sprite to blue; 
   break;
   ...
}

请告诉我这是否是您正在寻找的。我没有测试过自己,所以也许有一些错别字。