Coisas que eu quero fazer
No Unity, o Transform.Translate não traduziu a distância esperada.
Vamos investigar o que está acontecendo e propor soluções.
Esta seção discute a quantidade de movimento por chamada. Para comportamentos inesperados ao chamar Update ou FixedUpdate repetidamente, consulte o seguinte (Time.deltaTime deve ser levado em consideração).
Exemplo específico
Tentei o seguinte código.
Debug.Log("Before Local:" + obj.localPosition.x);
obj.Translate(-70f, 0f, 0f);
Debug.Log("After Local:" + obj.localPosition.x );Resultado:
Antes do Local: 755.3287
Após Local:580.3287
O resultado esperado após o teste era 750,3287 – 70 = 680,3287, mas não foi isso que aconteceu.
Por que os resultados foram diferentes do esperado?
Em seguida, tente o seguinte código.
Debug.Log("Before Local:" + obj.localPosition.x);
Debug.Log("Before World:" + obj.position.x );
obj.Translate(-70f, 0f, 0f);
Debug.Log("After Local:" + obj.localPosition.x );
Debug.Log("After World:" + obj.position.x );Resultado:
Antes do Local: 755.3287
Antes do Mundo: 716.1315
Após Local:580.3287
Após o mundo: 646,1315
Conforme demonstrado nos resultados acima, a coordenada x das coordenadas mundiais é subtraída por 70.
Em outras palavras, a direção da função Translate pode ser especificada pelo segundo argumento, sendo o valor padrão o sistema de coordenadas local, mas a distância é calculada no sistema de coordenadas mundial.
Portanto, tentar especificar a distância do movimento usando o sistema de coordenadas local não resultará no comportamento esperado.
Solução
Existem várias soluções, mas eu criei a seguinte função. (Como foi criada para jogos 2D, o valor de z é opcional.)
void MoveTransfrom(Transform obj, float x, float y, float z = 0) {
obj.localPosition = new Vector3(obj.localPosition.x + x, obj.localPosition.y + y, obj.localPosition.z + z);
}

コメント