2 pontos parte 2Como dito no post anterior, vou descrever como utilizar o estudo realizado coma linha bezier em um jogo.Imagine: depois de varias fases, finalmente o jogador chega a ultima e estaprestes a enfrentar o chefao. Para derrota-lo, e necessario coletar itens esomente quando tiver o suficiente (vamos dizer 3), ele podera atirar contra oinimigo.Ao final do post, adicionei um exemplo similar a esse.Como ja explicado, a linha bezier funciona atraves de 4 pontos: a origem e odestino mais 2 pontos auxiliares que criam a curva. No jogo, nao precisamos veressa curva, so precisamos garantir que o ponto inicial e final estejamposicionados corretamente. Ha varias maneiras de se fazer isso. No exemploutilizado e bem simples, ja que eu possuo somente um inimigo. Caso no jogotenha varios inimigos, basta adicionar o script no seu personagem principal,colocar o ponto inicial como o proprio objeto e o ponto final como o inimigo equando instanciar o projetil, atualizar a posicao de acordo com a curva.Neste exemplo, eu adicionei o script da linha bezier diretamente no projetil,portanto, a posicao inicial e o jogador e a posicao final e o canhao.Codigo:1.posInicial =GameObject.FindGameObjectWithTag("Player").transform.position;2.posFinal = GameObject.FindGameObjectWithTag("Cannon").transform.position;Os outros 2 pontos auxiliares sao definidos dentro da funcao GetPointAtTime.Simplesmente coloco eles 5 unidades acima do ponto de origem e isso faz com quese tenha um efeito bom.Codigo:1.Vector3 p0 =pos1; //origem2.Vector3 p1 = pos1 + new Vector3(0f,5f,0f); //auxiliar 13.Vector3 p2 = pos2 + new Vector3(0f, 5f, 0f); //auxiliar 24.Vector3 p3 = pos2; //destinoE necessario criar uma condicao para que, quando a bala atingir o canhao, estee a bala explodam.Codigo:01.void OnTriggerEnter(Collider other)02.{03.if (other.gameObject.tag == "Cannon")04.{05.Instantiate(explosion, transform.position, transform.rotation);06.Destroy(posFinal.gameObject);07.Destroy(gameObject);08.}09.}E agora e so fazer com a que o projetil se desloque. Como a funcao da linhabezier e em funcao do tempo, utiliza-se uma variavel que adiciona frame a frameo tempo do ultimo frame. Assim e possivel controlar a velocidade.Codigo:1.void Update()2.{3.temp += Time.deltaTime; //a cada frame, adiciona-se a essa variavel que eutilizada pela funcao posteriormente4.this.transform.position = GetPointAtTime(temp, posInicial,posFinal.position);5.}O codigo final fica assim:BezierCurve.csCodigo:01.using UnityEngine;02.using System.Collections;03.using System.Collections.Generic;04.using System;05. 06.public class BezierCurve : MonoBehaviour07.{08.//posicao inicial e final09.private Vector3 posInicial = new Vector3();10.private Transform posFinal;11. 12.//prefab que contem a explosao13.public GameObject explosion;14. 15.//tempo auxiliarpara deslocar o projetil16.private float temp = 0f;17. 18.void Start()19.{20.posInicial =GameObject.FindGameObjectWithTag("Player").transform.position;21.posFinal = GameObject.FindGameObjectWithTag("Cannon").transform;22.}23. 24.void Update()25.{26.temp += Time.deltaTime; //a cada frame, adiciona-se a essa variavel que eutilizada pela funcao posteriormente27.this.transform.position = GetPointAtTime(temp, posInicial,posFinal.position);28.}29. 30.void OnTriggerEnter(Collider other)31.{32.if (other.gameObject.tag == "Cannon")33.{34.Instantiate(explosion, transform.position, transform.rotation);35.Destroy(posFinal.gameObject);36.Destroy(gameObject);37.}38.}39. 40.public Vector3 GetPointAtTime(float t, Vector3 pos1, Vector3 pos2)41.{42.//create a loop43.t = t % 1.0f;44.if (t < 0)45.{46.t = 1.0f + t;47.}48. 49.Vector3 p0 = pos1;50.Vector3 p1 = pos1 + new Vector3(0f,5f,0f);51.Vector3 p2 = pos2 + new Vector3(0f, 5f, 0f);52.Vector3 p3 = pos2;53. 54.return DoBezier4Points(t, p0, p1, p2, p3);55.}56. 57.public Vector3 DoBezier4Points(float t, Vector3 p0, Vector3 p1, Vector3 p2,Vector3 p3)58.{59.Vector3 point = Vector3.zero;60.float OneMinusT = (1f - t);61. 62.point += (Mathf.Pow(OneMinusT, 3) * p0);63.point += (3 * Mathf.Pow(OneMinusT, 2) * t * p1);64.point += (3 * OneMinusT * Mathf.Pow(t, 2) * p2);65.point += (Mathf.Pow(t, 3) * p3);66. 67.return point;68.}69.} Dentro/fora da pistadetectar se um objeto esta dentrou ou fora do trajeto delimitado.Existem varias maneiras de se fazer isso e entre