Проблема вот в чем...
Есть некий скрипт по поиску путей и внешних ошибок в нем как бы и нету, но... видимо сам алгоритм поиска путей уже изначально был разработан неверно и потому на практике выявляется очень нехороший глюк. По пустякам стараюсь вас не тревожить, но тут ведь совсем другой случай, так ведь?
Позавчера переписывался с автором скрипта и да, он сам подтвердил, что проблема существует, но решить он ее так и не смог. Потому продолжает кормить публику ломаным продуктом. - http://www.youtube.com/watch?v=i3HunQfX ... re=mh_lolz
В данной ссылке он описывает сам алгоритм, который на первый взгляд кажется рабочим.
Уже как несколько дней пытаюсь починить скрипт, но все безуспешно.
Возможно Наши монстры в состоянии вылечить сие творение? Из последних сил пытался сделать все сам, но как видите не вышло.
Снял маленькое видео с акцентом на глюк:
на всякий пожарный ссылка на видео: http://www.youtube.com/watch?v=kBiTUOZW ... e=youtu.be
А вот и сам проект с разложенными скриптами по полочкам. - (FPS1.33.zip)
http://forum.unity3d.com/threads/127273 ... post858624
Очень надеюсь на вашу помощь. Зарание бесконечное спасибо на всех языках галактики!
P.S. Если вдруг причина нежелания помочь будет заключаться в JS, я с радостью перепишу все на C#. Только cкажите
На всякий случай дополнительно прикрепляю скрипты.
AIpathCellScript
Синтаксис:
Используется javascript
var doors = new Array();
function OnTriggerEnter (other : Collider)
{
if (other.tag == "AIpathDoor"){
doors.Add(other.gameObject);
}
}
AIpathDoorScript
Синтаксис:
Используется javascript
var cells = new Array();
var doorsToCells = new Array();
var imediateCells = new Array();
var testForCells : boolean = true;
var waitToTestCells : float = 2;
var stage : int = 1;
@HideInInspector
var doorOpen : boolean = true;
function Awake ()
{
doorOpen = true;
cells = GameObject.FindGameObjectsWithTag("AIpathCell");
doorsToCells.length = cells.length;
testForCells = true;
waitToTestCells = 2;
stage = 1;
}
function Update ()
{
if (testForCells && waitToTestCells <= 0)
{
for (var imediateCell : GameObject in imediateCells)
{
for (var i : int = 0; i <= cells.length - 1; i++)
{
if (cells[i] == imediateCell)
doorsToCells[i] = 1;
}
}
for (stage = 2; stage <= cells.length; stage++)
{
for (i = 0; i <= cells.length - 1; i++)
{
if (doorsToCells[i] == stage - 1)
for (var checkDoor : GameObject in cells[i].GetComponent(AIpathCellScript).doors)
{
if (checkDoor != gameObject)
{
for (var checkCell : GameObject in checkDoor.GetComponent(AIpathDoorScript).imediateCells)
{
for (var j : int = 0; j <= cells.length - 1; j++)
{
if (cells[j] == checkCell && doorsToCells[j] == null)
doorsToCells[j] = stage;
}
}
}
}
}
}
testForCells = false;
Debug.Log(doorsToCells);
}
waitToTestCells -= 1;
}
function OnTriggerEnter (other : Collider)
{
if (other.tag == "AIpathCell")
imediateCells.Add(other.gameObject);
}
PlayerMovementScript
Синтаксис:
Используется javascript
function OnTriggerStay (hitTrigger : Collider)
{
if(hitTrigger.tag == "AIpathCell")
currentCell = hitTrigger.gameObject;
EnemyMovementScript
Синтаксис:
Используется javascript
var playerCell : GameObject; //
var goalDoor : GameObject; //
var shortestPathSoFar : float; //
@HideInInspector
var waitToStart : int = 5;
var currentMoveSpeed : float = 5;
var lastCell : GameObject;
function Awake ()
{
shortestPathSoFar = Mathf.Infinity;
playerMovementScript = GameObject.FindWithTag("Player").GetComponent(PlayerMovementScript);
playerTransform = GameObject.FindWithTag("Player").transform;
waitToStart = 5;
}
function Update ()
{
if(waitToStart <= 0 && (currentCell != lastCell || playerCell != playerMovementScript.currentCell))
{
lastCell = currentCell;
playerCell = playerMovementScript.currentCell;
for (var doorCheckingNow : GameObject in currentCell.GetComponent(AIpathCellScript).doors)
{
for (var i : int = 0; i <= doorCheckingNow.GetComponent(AIpathDoorScript).cells.length - 1; i++)
{
if (doorCheckingNow.GetComponent(AIpathDoorScript).cells[i] == playerCell)
if (doorCheckingNow.GetComponent(AIpathDoorScript).doorsToCells[i] < shortestPathSoFar)
{
goalDoor = doorCheckingNow;
shortestPathSoFar = doorCheckingNow.GetComponent(AIpathDoorScript).doorsToCells[i];
}
}
}
shortestPathSoFar = Mathf.Infinity;
}
waitToStart -= 1;
if(goalDoor && currentCell != playerCell)
transform.position += (goalDoor.transform.position - transform.position).normalized * currentMoveSpeed * Time.deltaTime;
if(playerCell == currentCell)
transform.position += (playerTransform.position - transform.position).normalized * currentMoveSpeed * Time.deltaTime;
}
function OnTriggerEnter (hitTrigger : Collider)
{
if (hitTrigger.tag == "AIpathCell")
currentCell = hitTrigger.gameObject;
}