Trying To Write Animal Artifical Intelligence Without Nav Things, Moving The Randomly Rotated Object To The Forward For a Random Distance And Returning To Back If Movement Is Done,Moving The Randomly Rotated Animal To The Random Distance In Forward
Here is my logic :
1-Rotate the object in Y axis for random deggre.
2-Move the object for a random distance in forward.
3-If movement is complete return to the first one(rotate…)
The answers about this kind of questions are something like that :
1-Take the current position
2-Add random values to the current position
3-Lerp between them
But this doesn’t fit in my case because my object is rotated and I only want it to move in Vector3.forward.
I wrote something like that but its completely useless :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/*
Hayvanın hareketini yapması ve hayvan hareket ederken hareket bitene kadar yapay zekanın başka hareket yapmaması gerekiyor.
Hayvanın hareketinin bittiğini ve bırakması gerektiğini anlamamız için de gitmesi gereken noktayı bulmalıyız.
Bu nokta ile şuanki bulunduğu nokta arası uzaklığı sürekli kontrol edip bu uzaklık 0 olduğunda hayvanın hareketini kesmesi gerektiğini anlamalıyız.
Ancak sıkıntılar burada başlıyor.
Hayvanı sürekli forward da hareket ettirdiğimiz için mesela 90 ve 270 derece rotasyonda hayvanın yeri değişse de pozisyon bilgisi değişmiyor.
Belki Transform.Translate'de bunun için bir şey vardır, pozisyon bilgisi değişiyordur veya hayvanın yeri değişmiyordur ama editörde böyle, bilmiyorum.
Ayrıca mesela 90-270 arası İleri gittiğimizde, Pozisyon Z değeri düşüyor bu durumda şuanki Script Z değeri ile varip varmadığını anladığı için sıkıntı
oluyor.
Ayrıca mesela 10 derecede 10 metrelik hareket 10 saniye sürüyor ise, 40 derecede 10 metrelik hareket 40 saniye sürüyor ve sanırım aslında 10 metre değil çok
daha fazla hareket ettiriyor yada normal uzaklıkda hareket ettiriyor ancak bunu çok daha yavaş yaparak çok daha fazla zaman alıyor.
Buraya yazdıklarım sanırım yapılması gerekenleri baya iyi açıklamıştır çünkü ben bunu şimdi kapatınca bir daha baktığımda aklım almayacak :D
*/
public class animalAI : MonoBehaviour {
public float cSec = 3.0f; //Kaç saniyede bir bu kontrolleri falan yapsın diye yazdığım bir değer.
public float waitFor = 3.0f;
public int canliSira;
private float ne_Tarafa;
private float ne_Kadar;
public float maks_Dönme = 89f;
public float min_Dönme = 9f;
public float min_Metre = 2f;
public float maks_Metre = 8f;
public GameObject my_Eye; //Her Hayvana bir tane göz objesi oluşturacağım ki boyuna orantılı olarak Raycast ile önünü kontrol etsin.
public float checkDistance;
public RaycastHit hit;
public float smoothFactor = 2.0f;
private Vector3 lrot; //son rotasyon
private Vector3 lpos; // son pozisyon
private Vector3 target;
private bool waitFormove = false;
public void Start()
{
}
public void Update()
{
if (cSec >= 0)
{
cSec -= Time.deltaTime; //Eğer bekleme süresi 0 dan fazlaysa ki biz düşürmediğimiz sürece alttaki fonksiyonda eklediğimiz kadar fazla olur,süreyi azalt.
}
if (cSec <= 0 && waitFormove == false)
{
ne_Tarafa = Random.Range(min_Dönme,maks_Dönme); //Bunu ne kadar döneceğini belirlerken kullanacağız.
ne_Kadar = Random.Range(min_Metre, maks_Metre); //Bunu döndüğümüz tarafa gitmeye karar verirsek ne kadar gideceğimizi belirlemek de kullanacağız.
print(ne_Tarafa);
checkDistance = ne_Kadar; //Gideceği yere kadar Raycast atmalı daha uzağa yada yakına atarsa çok saçma ve buglu olur.
lrot = this.transform.localEulerAngles;
lpos = this.transform.position;
transform.eulerAngles = new Vector3(lrot.x,lrot.y + ne_Tarafa,lrot.z);
target.z = lpos.z + ne_Kadar;
print("Target z" + target.z);
if (transform.position.z < target.z)
{
waitFormove = true;
}else if(target.z <= transform.position.z){
waitFormove = false;
}
print("Waitformove İlk Döngü" + waitFormove);
if (Physics.Raycast(my_Eye.transform.position, my_Eye.transform.forward, out hit, checkDistance))
{
//Burada vurduğu şeyin değerlerini barındıran Identify scriptini çağırıp kontrol edip ona göre hareket etmesi lazım ancak,şuan bi normal yazalım.
}
cSec += waitFor;
}
if (waitFormove == true)
{
if (this.transform.rotation.eulerAngles.y < 90 || this.transform.rotation.eulerAngles.y > 270)
{
if (this.transform.position.z < target.z)
{
transform.Translate(Vector3.forward * Time.deltaTime * smoothFactor);
print("Translate Z" + this.transform.position.z);
//print("Waitformove İkinci Ilk Kontrol" + waitFormove);
}
if (this.transform.position.z >= target.z)
{
waitFormove = false;
//print("Waitformove Son Kontrol" + waitFormove);
}
}
if (this.transform.rotation.eulerAngles.y > 90 || this.transform.rotation.eulerAngles.y < 270)
{
if (this.transform.position.z < target.z)
{
transform.Translate(Vector3.forward * Time.deltaTime * smoothFactor);
print("Translate Z" + this.transform.position.z);
//print("Waitformove İkinci Ilk Kontrol" + waitFormove);
}
if (this.transform.position.z >= target.z)
{
waitFormove = false;
//print("Waitformove Son Kontrol" + waitFormove);
}
}
}
}
}
In that script I tried to check if my object is reached to the target with comparing the position.z values but its not working properly because when you are moving a rotated object to the forward the position value which is changing is not only the Z but also X.
It was so hard for me to write such thing in English sorry for that.