Vector3 v3 = Vector3.one;
Vector2 v2 = v3;
Vector3s se puede convertir implícitamente a Vector2 (se descarta z).
http://docs.unity3d.com/ScriptReference/Vector2-operator_Vector3.html
Si tiene que hacer muchas conversiones, puede que tenga que cambiar la forma en que usa sus vectores. Haga dos pruebas y cronometralas para ver cuál funciona para usted.
ACTUALIZACIÓN CON PRUEBAS:
como usted preguntó cuál es la más rápida , creé una prueba con 10000000 conversiones de cada una en Unity. Parece que la versión de inicialización es más rápida en este caso. PERO, siempre debes usar el que se adapte a tu propio contexto, por lo que te aconsejo que realices tus propias pruebas en tu juego.
TestConvertByOperation 10000000 instancias: 0.2714049s
TestConvertByCasting 10000000 instancias: 0.286027s
TestConvertByInitializing 10000000 instancias: 0.1458781s
using UnityEngine;
public class TestVector3Conversion : MonoBehaviour
{
readonly int iterations = 10000000;
Vector3 testVector = new Vector3(3f, 14f, 42f);
void Start()
{
Debug.Log(string.Format("TestConvertByOperation {0} instances: {1}s", iterations, TestConvertByOperation()));
Debug.Log(string.Format("TestConvertByCasting {0} instances: {1}s", iterations, TestConvertByCasting()));
Debug.Log(string.Format("TestConvertByInitializing {0} instances: {1}s", iterations, TestConvertByInitializing()));
}
float TestConvertByOperation()
{
var timeStart = Time.realtimeSinceStartup;
for (int i = 0; i < iterations; i++)
{
Vector2 v2 = testVector;
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByCasting()
{
var timeStart = Time.realtimeSinceStartup;
for (int i = 0; i < iterations; i++)
{
Vector2 v2 = (Vector2)testVector;
}
return Time.realtimeSinceStartup - timeStart;
}
float TestConvertByInitializing()
{
var timeStart = Time.realtimeSinceStartup;
for (int i = 0; i < iterations; i++)
{
Vector2 v2 = new Vector2(testVector.x, testVector.y);
}
return Time.realtimeSinceStartup - timeStart;
}
}