Trajetoria com linha bezier entre 2 pontosNeste post sera explicado como fazer um objeto seguir uma determinadatrajetoria curvilinea entre dois pontos quaisquer. Isso e util quando voceprecisa fazer um objeto percorrer um trajeto e chegar em determinado ponto. Eum script de simples manuseio e configuracao. Vamos la. O script e bem simples, nao e nada mais nada menos do que a transcricao dafuncao de uma curva bezier cubica. Como e em funcao do tempo, e ideal para ocaso, pois pode-se usar o Time.time para o deslocamento do objeto.Quando eu criei esse script, eu necessitava para disparar um projetil contra umalvo e o tiro tinha que ser certeiro. Inicialmente a minha ideia foi usar afisica calculando a distancia entre os dois objetos e calculando a velocidadeinicial necessaria para o projetil atingir o alvo com um angulo de 45 graus.Mas me dei conta de que se o objeto nao estivesse na mesma altura do outro, otiro nao chegaria.Apos isso, pensei em utilizar a propriedade Vector3.Slerp() do Unity, masdepois de alguns testes desisti e fui investigar outro metodo.Lembrei que uma vez eu havia visto uma animacao feita com linhas bezier e fuiprocurar a respeito e ta-dam!Com uma simples funcao e possivel criar uma linha curvilinea! Para saber mais detalhes, aconselho a leitura na wikipedia: Vamos la entao. Para criar uma curva bezier do tipo cubica sao necessarios 4pontos: o ponto inicial, o ponto final e dois pontos auxiliares que criarao acurva. Neste exemplo que eu vou dar, os 4 pontos estao na cena organizadosdessa maneira: O script BezierCurve esta no objeto Bezier.view sourceprint?Codigo:01.public class BezierCurve : MonoBehaviour02.{03. //points that will create the bezier curve04. public Transform pos1;05. public Transform pos2;06. private GameObject pos1_aux;07. private GameObject pos2_aux;08. 09. void Awake()10. {11. //pos1_aux and pos2_aux are the children of the main position12. pos1_aux = (GameObject)pos1.GetChild(0).gameObject;13. pos2_aux = (GameObject)pos2.GetChild(0).gameObject;14. }Os objetos pos1_aux e pos2_aux serao encontrados pelo script e movimentandoeles, sera possivel criar a curva.Como ja temos a posicao dos 4 pontos, basta agora passar esses 4 pontos emfuncao do tempo.view sourceprint?Codigo:01.//take the point and send to DoBezier4Points tocalculate02.public Vector3 GetPointAtTime(float t)03.{04. //create a loop - this garantee that t will never be > 105. t = t % 1.0f;06. if (t < 0)07. {08. t = 1.0f + t;09. }10. 11. //create the vectors just to make a clean code12. Vector3 p0 = pos1.position; //initial point13. Vector3 p1 = pos1_aux.transform.position; //auxiliar of initial point14. Vector3 p2 = pos2_aux.transform.position; //auxiliar of end point15. Vector3 p3 = pos2.position; //end point16. 17. //call the function DoBezier4Points to calculate18. return DoBezier4Points(t, p0, p1, p2, p3);19.}20. 21. //calculate the position of the point at time t22. public Vector3 DoBezier4Points(float t, Vector3 p0, Vector3 p1, Vector3 p2,Vector3 p3)23. {24. //this is the function to create a cubic bezier curve25. Vector3 point = Vector3.zero;26. float OneMinusT = (1f - t);27. 28. point += (Mathf.Pow(OneMinusT, 3) * p0);29. point += (3 * Mathf.Pow(OneMinusT, 2) * t * p1);30. point += (3 * OneMinusT * Mathf.Pow(t, 2) * p2);31. point += (Mathf.Pow(t, 3) * p3);32. 33. return point;34. }Agora basta enxergar a curva criada. Para isso,