如何在对象A处于范围内时更改对象B的颜色? 2D

时间:2018-07-19 00:10:37

标签: c# unity3d distance object-detection

我有一个敌方AI对象,它随机巡逻一个自上而下的2d迷宫(对象B),并且在该迷宫内是图块(A的多个对象)。我在寻找一种方法来更改仅1个与敌方对象B距离不远的瓦片的颜色时遇到了麻烦。这是我的代码:

公共转换块;

 private void Update()
 {
     blocks = GameObject.FindGameObjectWithTag("Breakable_Block").transform;

     if (Vector2.Distance(transform.position, blocks.position) < 10)
     {
         blocks.GetComponent<Renderer>().material.color = Color.green;
     }


 }

我要对我的项目进行的操作是在迷宫中随机安排一个看不见的敌方对象巡逻,当它接触或接触1个瓷砖的范围时,瓷砖会改变颜色。当敌人移开时,瓷砖会变回其常规颜色。之所以我使用距离而不是碰撞,是因为我无法让敌方物体撞到并卡住瓷砖本身。

Enemy is sky-blue and tiles are purple.

谢谢!

1 个答案:

答案 0 :(得分:3)

编辑 我错误地将FindGameObjectWithTag读为FindGameObjectsWithTag。第一个返回单个GameObject,第二个返回一个GameObjects数组。因此,下一段是不正确的。如果将有多个“ Breakable_Block”对象,我仍然倾向于使用触发器。如果只有一个“ Breakable_Block”,则Vector2.Distance可能更合适。

因此,快速注意一下,GameObject.FindGameObjectWithTag("Breakable_Block")将返回一个GameObjects数组,因此您给出的代码示例将无法找到玩家到整个数组的距离。您需要找到到单个对象的距离。其中涉及更多代码。这就是我认为使用Unity中可用工具可能更简单的原因。

所以,我可以这样实现:

这是一个可以放在敌人(对象B)上的快速代码示例。

public class Enemy : MonoBehaviour
{
  void OnTriggerEnter2D ( Collider2D other )
  {
    other.GetComponent<Renderer>().material.color = Color.green;
  }

  void OnTriggerExit2D ( Collider2D other )
  {
    other.GetComponent<Renderer>().material.color = Color.red;
  }
}