c# - objetos - obtener la posicion de un objeto unity
¿Por qué las declaraciones en Unity3d C#permiten objetos que no son bools? (1)
No te preocupes demasiado por esto. El if (obj)
solo es legal en Unity porque hay una sobrecarga de operador implícita en Unity. Creo que eso se hizo en la clase MonoBehaviour
o UnityEngine.Object
.
Se ve algo como esto:
public static implicit operator bool($classname$ other){
return other != null;
}
Unity planeado para eliminar esta característica, pero decidió ir en contra porque rompería todos los códigos de Unity. Puedes leer más sobre esto aquí .
El lado muy malo de esta característica es que imposibilitó el uso de la función del operador Nulo-Coalescente en el Editor. El lado positivo es que simplifica la comprobación de null
.
En el compilador .NET 4.6 estándar, la siguiente instrucción if no es legal, obtendrá el error del compilador: CS0029 No se puede convertir implícitamente el tipo ''UserQuery.TestClass'' a ''bool''. Esto está muy bien, y entiendo esto.
void Main()
{
TestClass foo = new TestClass();
if(foo)
{
"Huh. Who knew?".Dump();
}
}
public class TestClass : Object
{
}
Sin embargo, en Unity3d este código es perfectamente legal y he visto varios ejemplos que incluso fomentan este estilo JavaScript de comprobación nula.
¿Qué está pasando aquí y es posible aprovechar esto en mi trabajo no Unity3d en .NET?
Aquí hay un ejemplo de código legal en Unity3D:
using UnityEngine;
public class SampleIfBehavior : MonoBehaviour
{
// Use this for initialization
void Start ()
{
var obj = new SampleIfBehavior();
if (obj)
{
Console.Write("It wasn''t null.");
}
}
}
¡La trama se complica! Si intento comparar un objeto que no deriva del comportamiento mono, obtengo la advertencia del compilador esperado.
public class TestClass
{
}
void Start ()
{
var obj2 = new TestClass();
if (obj2) // cast from TestClass to bool compiler error
{
}
}
Gracias al Programador, busqué todo el camino hasta el Objeto de Unity3D (lo pasé por alto porque asumí erróneamente que era el objeto real de .NET).
Código relevante para curiosos (en UnityEngine.Object):
public static implicit operator bool(Object exists)
{
return !Object.CompareBaseObjects(exists, (Object) null);
}
public static bool operator ==(Object x, Object y)
{
return Object.CompareBaseObjects(x, y);
}
public static bool operator !=(Object x, Object y)
{
return !Object.CompareBaseObjects(x, y);
}