Vector3 v3 = Vector3.one;
Vector2 v2 = v3;
Os Vector3s podem ser implicitamente convertidos em Vector2 (z é descartado).
http://docs.unity3d.com/ScriptReference/Vector2-operator_Vector3.html
Se você precisar fazer muitas conversões, pode ser necessário alterar a maneira como você usa seus vetores. Faça dois testes e cronometre-os para ver qual deles funciona para você.
ATUALIZAÇÃO COM TESTES:
Como você perguntou qual é o mais rápido , criei um teste executando 10000000 conversões de cada uma no Unity. Parece que a versão Inicializando é a mais rápida nesse caso. MAS, você deve sempre usar aquele que se adapte ao seu próprio contexto, por isso aconselho a executar seus próprios testes no seu jogo.
Instâncias TestConvertByOperation 10000000: 0.2714049s
Instâncias TestConvertByCasting 10000000: 0.286027s
Instâncias TestConvertByInitializing 10000000: 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;
}
}