Не равны prefab объекта и объект
Есть prefab (являющийся trigger'ом), передающийся в скрипт через public переменную:
public GameObject RedSphere;
В скрипте создается объект с его помощью:
Instantiate(RedSphere);
Объект spawn'ится, но при сравнении (в функции OnTriggerEnter, когда тело с прикрепленным скриптом касается объекта) условие не выполняется:
other.gameObject == RedSphere
Почему так происходит и как это исправить?
Ответы (1 шт):
Вы можете сравнивать так базовые типы:
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;
}
}
