Пятница, 19 Апреля 2024, 23:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Помогите, я не понимаю что не так (Проблема с лучом (Ray))
Помогите, я не понимаю что не так
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
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Помогите, я не понимаю что не так (Проблема с лучом (Ray))
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг