Не равны prefab объекта и объект

Есть prefab (являющийся trigger'ом), передающийся в скрипт через public переменную:

public GameObject RedSphere;

В инспекторе

В скрипте создается объект с его помощью:

Instantiate(RedSphere);

Объект spawn'ится, но при сравнении (в функции OnTriggerEnter, когда тело с прикрепленным скриптом касается объекта) условие не выполняется:

other.gameObject == RedSphere

Почему так происходит и как это исправить?


Ответы (1 шт):

Автор решения: Yaroslav

Вы можете сравнивать так базовые типы:

int A = 3;
int B = 3;
bool AB = A == B; // true

Тоже самое с структурами(struct):

Vector2 A = new Vector2(1, 2);
Vector2 B = new Vector2(1, 2);
bool AB = A == B; // true

С объектами это не так:

int[] A = { 1, 2, 3 }; // массив это объект
int[] B = { 1, 2, 3 };
bool AB = A == B; // false

При передачи объектов в значение полей/переменных или как аргументы, передаётся только ссылка на объект, а не значения как с базовыми типами и структурами. При сравнении объектов сравниваются именно их ссылки и это является проверкой, является ли объект тем самым.

Вы можете присвоить префабу уникальный Tag или Layer и сравнивать по ним:

other.gameObject.tag == RedSphere.tag;
other.gameObject.layer == RedSphere.layer;

Либо повесить на них какой нибудь скрипт для сравнения объектов по нему:

public enum ObjectColor { Red, Green, Blue }
public enum ObjectShape { Sphere, Cube }

public class ColorShape : MonoBehaviour
{
    public ObjectColor Color;
    public ObjectShape Shape;
}
        

public class Foo : MonoBehaviour 
{
    [SerializeField] private ColorShape _redSphereTemplate;

    public void SpawnRedSphere ()
    {
        Instantiate(_redSphereTemplate.gameObject);
    }

    private void OnCollisionEnter (Collision collision)
    {
        if (collision.TryGetComponent(out ColorShape colorShape))
        {
            bool Same = SameColorShape(colorShape, _redSphereTemplate);
        }
    }
    
    private bool SameColorShape (ColorShape csA, ColorShape csB)
    {
        return csA.Color == csB.Color && csA.Shape == csB.Shape;
    }
}
→ Ссылка