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 |
|
| |