Кодерское, Unity3D

Удивительно насколько генерация случайных решений и проверка каждого из них на соответствие условиям изначальной задачи эффективнее попыток решить задачу инженерно и творчески.

Вот у меня в приложении монстры раньше ходили по путевым точкам, мне приходилось выстраивать связи между этими точками, настраивать порядок в котором монстры обходят точки, приоритеты выставлять при выборе следующей точки и все равно было очевидно что они ходят одними маршрутами, а еще они утыкались в препятствия и постоянно тупили. А глагне, все эти ебические сотни строк кода, часы настройки всей этой фигни!

И тут я понял жизнь! В 50 строках кода я описал скрипт который надо просто повесить на монстра, далее он просто тыкает в случайную точку пространства вокруг монстра и если там можно стоять и туда можно дойти по прямой, передает монстру координаты в качестве точки куда идти.
И сука все! А главное, они ходят как живые, не утыкаются в стены, ведут себя довольно непредсказуемо что круто.
Случайность + отбор работают намного лучше разумного творения в любой задаче. Вот реально же в любой.
Даже странно что кто-то эволюцию отрицать пытается.

Кстати, с ростом вычислительной мощности подобные решения сделают работу всех людей, которые что-то придумывают или проектируют бесполезной и бессмысленной :3


Код для Unity само собой, название файла д.б. WaypointScanner.cs

using System.Collections.Generic;
using UnityEngine;

public class WaypointScanner : MonoBehaviour {
//Задаем переменные
private GameObject ThisObject; private Transform ThisObjectT;
private GameObject ScanPoint; private Transform ScanPointT;
private float RandomX = 0.0f, RandomZ = 0.0f;
private RaycastHit hit;
private Vector3 down, forward;
private bool ReScan = false, Ground = true;
private int ThisID = 0, ScanID = 0;
//Ловим и создаем нужные объекты
void Start () {ThisObject = this.gameObject;
ThisObjectT = ThisObject.transform;
ThisID = ThisObject.GetInstanceID();

ScanPoint = new GameObject("ScanPoint");
ScanPointT = ScanPoint.transform;

down = ThisObjectT.TransformDirection(Vector3.down);
Physics.queriesHitBackfaces = true;}

void Update () {if (ReScan == true) {CheckLocation ();}}

void CheckLocation () {
//Выбираем случайную точку вокруг и двигаем туда пустой объект
RandomX = Random.Range (ThisObjectT.position.x-(float)50.0,ThisObjectT.position.x+(float)50.0);
RandomZ = Random.Range (ThisObjectT.position.z-(float)50.0,ThisObjectT.position.z+(float)50.0);
ScanPointT.position = new Vector3 (RandomX,ThisObjectT.position.y+1,RandomZ);
//Проверяем сканером можно ли там стоять
if (Physics.Raycast (ScanPointT.position, down, out hit, 3.0f)) {Ground = true;} else {Ground = false;}
//Если можно, проверяем видно ли оттуда контроллер или модель монстра
if (Ground==true) {if (ThisObjectT.GetComponent<CharacterController>()!=null) {ScanPointT.LookAt(ThisObjectT.GetComponent<CharacterController>().bounds.center);}
else {ScanPointT.LookAt(ThisObjectT.GetComponent<Renderer>().bounds.center);}
forward = ScanPointT.TransformDirection(Vector3.forward);
if (Physics.Raycast (ScanPointT.position, forward, out hit, 200.0f)) {ScanID = hit.collider.gameObject.GetInstanceID();
if (ScanID==ThisID) {ReScan = false; ThisObject.SendMessage ("GetWaypoint", ScanPoint);} //Если видно, сообщаем монстру куда идти
else {ReScan = true;}} //Если не видно, повторяем заново
}
}
//Вызываем эту функцию что бы начать процесс
public void StartScan () {ReScan = true;}
}
Комментарии: 0

Добавить комментарий

Вы не можете комментировать эту запись по причине: Добавлять комментарии для этой записи могут только зарегистрированные пользователи.