[TUTORIAL] Instanciar coisas no Terreno
2 participantes
Página 1 de 1
[TUTORIAL] Instanciar coisas no Terreno
óla trago aqui um tuto, de um script que desenvolvi ele instancia coisas no terreno
segue o script:
o script ta bem comentado qualquer duvida só dizer
segue o script:
- Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class InstanciarObj : MonoBehaviour {
[Tooltip("A ordem de se começar o instanciamento")]
public bool Instanciar;
[Tooltip("isto evita que ocorra um loop infinito caso não consiga instanciar os obj")]
public int Tentativas;
[Space(20)]
[Tooltip("Deleta as arvores instanciadas")]
public bool DeletarArvores;
[Tooltip("Deleta as Obj instanciadas")]
public bool DeletarObj;
[Space(20)]
[Tooltip("A quantidade de maxima de obj a ser instanciado")]
public int MaximoObj=100;
[Space(5)]
[Tooltip("a distancia que há entre um obj e o outro")]
public float DistanciaEntre=2;
[Space(5)]
public int Contia;
[Space(20)]
[Tooltip("Se sera Intanciado arvores ou obj")]
public bool InstanciarArvore;
public bool InstanciarObjs;
[Space(30)]
[Tooltip("O area base que começa a Intanciar e termina instanciamento ")]
public Vector3 AreaInstanciarInicial=new Vector3 (10, 1000, 10);
[Space(5)]
public Vector3 AreaInstanciarFinal=new Vector3 (2400, 1000, 2400);
[Space(30)]
[Tooltip("O tamanho minimo do obj a instanciar")]
public Vector3 TamanhoMinimo = new Vector3 (1, 1, 1);
[Space(5)]
[Tooltip("O tamanho maximo do obj a instanciar")]
public Vector3 TamanhoMaximo=new Vector3 (2, 2, 2);
[Space(20)]
[Tooltip("os obj queseram instanciados")]
public GameObject ArvorePrfab;
[Space(20)]
[Tooltip("Os Prefabs dos objs que seram instanciados na cena")]
public List<GameObject> ObjsCena;
[Space(5)]
[Tooltip("da os valoes maximos de obj a serem inatanciados")]
public List<int> QuantiasObjsCena;
void Start () {
}
[ExecuteInEditMode]
void Update () {
if (Instanciar) {
if (InstanciarArvore) {
InstanciarTree ();
}
if (InstanciarObjs) {
InstanciarOBJs ();
}
if (NaoPossivel) {
Contia = contiaAnt;
NaoPossivel = false;
Tentativas = 0;
contiasObj = 0;
}
Instanciar = false;
}
if (DeletarArvores) {
for (int d = 0; d < ArvoresInstanciadas.Count; d++) {
DestroyImmediate (ArvoresInstanciadas[d]);
}
ArvoresInstanciadas.RemoveAll (ArvoresInstanciadas.Contains);
PontosInstanciados.RemoveAll (PontosInstanciados.Contains);
Contia = 0;
//DeletarArvores = false;
}
if (DeletarObj) {
for (int d = 0; d < ObjInstanciados.Count; d++) {
DestroyImmediate (ObjInstanciados[d]);
}
ObjInstanciados.RemoveAll (ObjInstanciados.Contains);
PontosInstanciados.RemoveAll (PontosInstanciados.Contains);
contiasObj = 0;
//DeletarArvores = false;
}
}
[Space(50)]
public List <Vector3> PontosInstanciados;
bool NaoPossivel;
int contiaAnt;
[Space(50)]
public List<GameObject> ObjInstanciados;
[Space(10)]
public List<GameObject> ArvoresInstanciadas;
[ExecuteInEditMode]
void InstanciarTree(){
while (Contia < MaximoObj) {
int Inix = (int)( Random.Range (AreaInstanciarInicial.x, AreaInstanciarFinal.x));
int IniZ = (int)( Random.Range (AreaInstanciarInicial.z, AreaInstanciarFinal.z));
Vector3 PosiRandom = new Vector3 (Inix, 3000, IniZ);
//Debug.Log (PosiRandom.ToString ());
Vector3 ScaleRandom = new Vector3 ((
Random.Range (TamanhoMinimo.x, TamanhoMaximo.x)),
Random.Range (TamanhoMinimo.y, TamanhoMaximo.y),
Random.Range (TamanhoMinimo.z, TamanhoMaximo.z));
RaycastHit Hit;
Vector3 PosiRay = new Vector3 (PosiRandom.x, -2000, PosiRandom.z);
Vector3 PontoDist = new Vector3 (DistanciaEntre, 2000, DistanciaEntre);
Debug.DrawLine (PosiRandom, PosiRay, new Color (0, 1, 0));
Tentativas += 1;
if (Tentativas > 1000) {
Contia = MaximoObj;
Debug.Log ("NÃO FOI POSSIVEL CUMPRIR A ORDEM: Verifique a caixa da cena");
NaoPossivel = true;
}
if (PontosInstanciados.Count == 0) {
PontosInstanciados.Add (AreaInstanciarInicial);
}
for( int p = 0; p < PontosInstanciados.Count; p++){
Vector3 PosiVer = (PontosInstanciados [p] + PontoDist);
if(PosiRandom.x > PosiVer.x && PosiRandom.z > PosiVer.z){
if (Physics.Linecast (PosiRandom, PosiRay, out Hit)) {
Debug.DrawLine (PosiRandom, PosiRay, new Color (1, 0, 0));
if (Hit.collider.gameObject.GetComponent<SistemaDoChao> ()) {
//Debug.Log("Aqui");
GameObject Chao = Hit.collider.gameObject.GetComponent<Terrain>().gameObject;//aqui se verifica o terreno e pega o ponto em que o raycast bate no terreno
if (Chao) { // se chao foi detectado o obj é instanciado
Vector3 Posichao = Hit.point;
// Intancia arvores
if (InstanciarArvore) {
float NRot=Random.Range (0, 360);
Vector3 Rot = new Vector3 (0, NRot, 0);
GameObject TreeInst = Instantiate (ArvorePrfab, Posichao, Quaternion.Euler (Rot))as GameObject;
TreeInst.transform.localScale = (ScaleRandom);
TreeInst.transform.parent = Chao.transform;
Contia += 1;
contiaAnt = Contia;
PontosInstanciados.Add (TreeInst.transform.position);
ArvoresInstanciadas.Add (TreeInst);
TreeInst.name = "Arvore " + Contia.ToString();
Debug.Log ("Arvores Instanciados com Sucesso");
Tentativas = 0;
}
// Intancia objs
}
}
}
}
}
}
}
public int contiasObj;
bool Proceguir;
void InstanciarOBJs(){
for(int Obj=0; Obj < ObjsCena.Count; Obj++){
contiasObj = 0;
while (contiasObj < QuantiasObjsCena [Obj]) {
int Inix = (int)(Random.Range (AreaInstanciarInicial.x, AreaInstanciarFinal.x));
int IniZ = (int)(Random.Range (AreaInstanciarInicial.z, AreaInstanciarFinal.z));
Vector3 PosiRandom = new Vector3 (Inix, 3000, IniZ);
//Debug.Log (PosiRandom.ToString ());
Vector3 ScaleRandom = new Vector3 ((
Random.Range (TamanhoMinimo.x, TamanhoMaximo.x)),
Random.Range (TamanhoMinimo.y, TamanhoMaximo.y),
Random.Range (TamanhoMinimo.z, TamanhoMaximo.z));
RaycastHit Hit;
Vector3 PosiRay = new Vector3 (PosiRandom.x, -2000, PosiRandom.z);
Vector3 PontoDist = new Vector3 (DistanciaEntre, 2000, DistanciaEntre);
Debug.DrawLine (PosiRandom, PosiRay, new Color (0, 1, 0));
Tentativas += 1;
if (Tentativas > 1000) {
contiasObj = QuantiasObjsCena [Obj];
Debug.Log ("NÃO FOI POSSIVEL CUMPRIR A ORDEM: Verifique a caixa da cena");
NaoPossivel = true;
}
if (PontosInstanciados.Count == 0) {
PontosInstanciados.Add (AreaInstanciarInicial);
}
if (!PontosInstanciados.Contains (PosiRandom)) {
for (int p = 0; p < PontosInstanciados.Count; p++) {
Vector3 PosiVer = (PontosInstanciados [p] + PontoDist);
if (PosiRandom.x > PosiVer.x && PosiRandom.z > PosiVer.z) {
if (Physics.Linecast (PosiRandom, PosiRay, out Hit)) {
Debug.DrawLine (PosiRandom, PosiRay, new Color (1, 0, 0));
if (Hit.collider.gameObject.GetComponent<SistemaDoChao> ()) {
//Debug.Log("Aqui");
GameObject Chao = Hit.collider.gameObject.GetComponent<SistemaDoChao> ().gameObject;
if (Chao) { // se chao foi detectado o obj é instanciado
Vector3 Posichao = Hit.point;
// Intancia obj
float NRotx = Random.Range (0, 360);
float NRoty = Random.Range (0, 360);
float NRotz = Random.Range (0, 360);
Vector3 Rot = new Vector3 (NRotx, NRoty, NRotz);
GameObject Objinst = Instantiate (ObjsCena [0], Posichao, Quaternion.Euler (Rot))as GameObject;
Objinst.transform.localScale = (ScaleRandom);
Objinst.transform.parent = Chao.transform;
contiasObj += 1;
PontosInstanciados.Add (Objinst.transform.position);
ObjInstanciados.Add (Objinst);
Objinst.name = "Obj " + Obj.ToString () + "/" + contiasObj.ToString ();
Debug.Log ("Objs Instanciados com Sucesso");
Tentativas = 0;
}
}
// Intancia objs
}
}
}
}
}
}
}
}
o script ta bem comentado qualquer duvida só dizer
Re: [TUTORIAL] Instanciar coisas no Terreno
Não entendi o porquê de você ter usado o ExecuteInEditMode várias vezes, não era necessário somente um?
NKKF- ProgramadorMaster
- PONTOS : 4817
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] Achar coisas no projeto por script e poder setalas nos scripts
» [TUTORIAL] Deformar o terreno
» Pegar coisas do chao
» Mudança de FPS afetam a velocidade das coisas
» Como Faço Pra Ver Objetos Atravez das coisas??
» [TUTORIAL] Deformar o terreno
» Pegar coisas do chao
» Mudança de FPS afetam a velocidade das coisas
» Como Faço Pra Ver Objetos Atravez das coisas??
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos