| dzrone3488 | Дата: Воскресенье, 09 Ноября 2014, 01:14 | Сообщение # 1 |  
 
участник 
Сейчас нет на сайте 
 
 | Я не так давно(2-3 месяца назад) написал свой AI слендера. И тут решил его улучшить, а именно сделать так, чтобы слендер не спавнился на воздухе, или под землёй. Я осуществил это с помощью луча, который при смены позиции слендера, пускал лучи вверх и вниз проверяя: Если луч направленный вниз не столкнулся с колайдером объекта с тегом "terrain" он пускает вверх. И в обоих случаях если он всё таки столкнулся. Ставит слендера на позицию в которую врезался луч. Но у меня не получается.. Ошибок нету, не ругается Unity. Слендер просто продолжает спавниться на воздухе, и под землёй.   Помогите решить проблему...   Вот код, он большой: 
   Код    using UnityEngine;   using System.Collections; 
   public class SlenderAI : MonoBehaviour { 
    public GameObject point01;    public GameObject point02;    public GameObject point03;    public GameObject point04;        public RaycastHit hit;    public RaycastHit hitTwo;        public GUIText score;        public GameObject point01Stay2;    public GameObject point02Stay2;    public GameObject point03Stay2;    public GameObject point04Stay2;        public GameObject point01Stay3;    public GameObject point02Stay3;    public GameObject point03Stay3;    public GameObject point04Stay3;            private int randomPosition;    private int randomPosition2;    private int randomPosition3;        public Vector3 positionForSpawn;        public float secondForTimer;    private float timersSecondNow;           public float secondForTimer2;    private float timersSecondNow2;        public float secondForTimer3;    private float timersSecondNow3;        public Transform targetForLook;        void Start () {          timersSecondNow = secondForTimer;        }            void Update () {          transform.LookAt(targetForLook);          randomPosition = Random.Range(1,4);          if (timersSecondNow > 0) timersSecondNow -= Time.deltaTime;     if (timersSecondNow < 0) timersSecondNow = 0;     if (timersSecondNow == 0)      {      switch(randomPosition)      {      case 1:       positionForSpawn = point01.transform.position;       gameObject.transform.position = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }              break;      case 2:       positionForSpawn = point02.transform.position;       gameObject.transform.position  = positionForSpawn;        if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 3:       positionForSpawn = point03.transform.position;       gameObject.transform.position  = positionForSpawn;        if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 4:       positionForSpawn = point01.transform.position;       gameObject.transform.position  = positionForSpawn;        if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;             }      timersSecondNow = secondForTimer;     }      if (score.text == "3")      {       randomPosition2 = Random.Range(1,4);          if (timersSecondNow2 > 0) timersSecondNow2 -= Time.deltaTime;     if (timersSecondNow2 < 0) timersSecondNow2 = 0;     if (timersSecondNow2 == 0)      {      switch(randomPosition2)      {      case 1:       positionForSpawn = point01Stay2.transform.position;       gameObject.transform.position = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 2:       positionForSpawn = point02Stay2.transform.position;       gameObject.transform.position  = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 3:       positionForSpawn = point03Stay2.transform.position;       gameObject.transform.position  = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 4:       positionForSpawn = point01Stay2.transform.position;       gameObject.transform.position  = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;             }      timersSecondNow2 = secondForTimer2;      }           }      if (score.text == "6")      {       randomPosition3 = Random.Range(1,4);          if (timersSecondNow3 > 0) timersSecondNow3 -= Time.deltaTime;     if (timersSecondNow3 < 0) timersSecondNow3 = 0;     if (timersSecondNow3 == 0)      {      switch(randomPosition3)      {      case 1:       positionForSpawn = point01Stay3.transform.position;       gameObject.transform.position = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 2:       positionForSpawn = point02Stay3.transform.position;       gameObject.transform.position  = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 3:       positionForSpawn = point03Stay3.transform.position;       gameObject.transform.position  = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }       break;      case 4:       positionForSpawn = point01Stay3.transform.position;       gameObject.transform.position  = positionForSpawn;         if (Physics.Raycast(transform.position,new Vector3(-90.0f,0,0),out hit,100000.0f))         {      if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hit.point;        }        else        {         if (Physics.Raycast(transform.position,transform.up,out hitTwo,100000.0f))                     {          if (hit.collider.tag == "terrain")        {         gameObject.transform.position = hitTwo.point;        }         }        }      }              break;             }      timersSecondNow3 = secondForTimer3;      }           }    }     
   }     
  Я делаю игры, а вы в них играете! :)   Моя группа по созданию игр - www.vk.com/dzrone 
    
 |  
| 
 | 
 |    | 
| allods | Дата: Воскресенье, 09 Ноября 2014, 01:28 | Сообщение # 2 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | public LayerMask layer; //выбери Землю <будет игнорировать все остальные   RaycastHit hit;   if (Physics.Raycast(transform.position, -Vector3.up, out hit, 1000.0F,layer))   if (hit.collider.CompareTag("terrain"))   {   transform.position = hit.point;   }
 |  
| 
 | 
 |    | 
| dzrone3488 | Дата: Воскресенье, 09 Ноября 2014, 11:22 | Сообщение # 3 |  
 
участник 
Сейчас нет на сайте 
 
 | Цитата allods (  )  public LayerMask layer; //выбери Землю <будет игнорировать все остальные   RaycastHit hit;   if (Physics.Raycast(transform.position, -Vector3.up, out hit, 1000.0F,layer))   if (hit.collider.CompareTag("terrain"))   {   transform.position = hit.point;   }   
   Спасибо, теперь он хотя бы не спавниться на воздухе. Но проблема с появлением под землёй еще осталась.
  Я делаю игры, а вы в них играете! :)   Моя группа по созданию игр - www.vk.com/dzrone 
    
 |  
| 
 | 
 |    | 
| Левша | Дата: Воскресенье, 09 Ноября 2014, 15:32 | Сообщение # 4 |  
 
почти ветеран 
Сейчас нет на сайте 
 
 | Цитата dzrone3488 (  )  проблема с появлением под землёй еще осталась.      Коллайдер террейна снизу прозрачен для рейкаста, он односторонний.   Пускай луч всегда сверху > вниз, из точки над мобом.
  X.cor.R (Prologue)
 
 Сообщение отредактировал Левша - Воскресенье, 09 Ноября 2014, 15:32  |  
| 
 | 
 |    |