Merhaba İlk Olarak Basit bir yapay zeka Örneği İle Başlayacağım. başlangıçta bir düşman hazırlayalım ve içine Rigidbody ekleyelim Constraints seçeneğine tıklayıp. altta açılan bölümdeki freeze Rotation Bölümündeki X, Y ,Z bölümünden X' i ve Z yi İşaretleyelim. Bunları İşaretlememiz in sebebi Düşmanın fizik Yüzünden devrilmemesi içindir. X ekseni Sağ Sol Y ekseni Yukarı Aşağı Z ekseni ise ileri ve geri Yönünü temsil etmektedir. 2 D yani iki boyutlu oyunlarda ise sadece X ve Y eksenleri vardır. Bu Bölümde Sadece Kapsül Kullanarak Bir Yapay Zeka Yaptım.
Orta Ve İleri Düzey Yapay Zeka Derslerinde Yapay Zekaya ile Beraber Animasyonlar
(Animator Controller) Metotlarını da Kullanacağım.
Bir kule tasarlayıp koydum kuleyi yapmamın amacı yapacağınız oyunda birden çok yapay zekaya sahip karakterler koyarsanız nasıl bir yol izlemeniz gerektiğini öğrenmeniz için.
Örnek Verecek Olursak Online bir Oyun yaptınız ve oyunun içinde iki oyuncu var yaptığınız Yapay Zeka (düşman) öncelikle kime saldıracağına karar verip ona göre hareket edecek.
Bu Sadece Bir yol Bundan başka bir çok yol bulup kullanabilirsiniz.
Kulenin Ardından Bir C# Scripti oluşturuyoruz. ben Adına Enemy AI koydum Scripti Açıp Aşağıda yazmış olduğum Kodu Kopyalayıp Yapıştırıyoruz.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyAi : MonoBehaviour
{
Rigidbody Rb;
public Transform EnemyTransform;
public Transform TowerTransform;
public float EnemyDistance;
public float TowerDistance;
public float A = 100;
public float Speed = 5;
public float Speed2 = 30;
public float StrifeTime;
public float StrifeTimer;
public bool TowerWalk;
public bool TowerFire;
public bool EnemyWalk;
public bool EnemyFire;
public bool TowerBool = true;
public bool strife;
public bool strife2;
Vector3 EnemyPosition;
Vector3 TowerPosition;
void Start()
{
Rb. = GetComponent<Rigidbody>();
StrifeTime = Random.Range(1, 3);
StrifeTimer = Random.Range(1, 3);
}
void Update()
{
if (strife)
{
StrifeTime -= Time.deltaTime;
Rb.AddForce(transform.right * -Speed2);
Rb.AddForce(transform.forward * Speed2);
}
else
{
StrifeTime = Random.Range(1, 3);
}
if (strife2)
{
StrifeTimer -= Time.deltaTime;
Rb.AddForce(transform.right * Speed2);
}
else
{
StrifeTimer = Random.Range(1, 3);
}
if (StrifeTime <= 0)
{
strife = false;
strife2 = true;
StrifeTime = Random.Range(1, 3);
}
if (StrifeTimer <= 0)
{
strife = true;
strife2 = false;
StrifeTimer = Random.Range(1, 3);
}
//------------------------------------------------------------------------------------------------------------------
EnemyPosition = new Vector3(EnemyTransform.position.x, transform.position.y, EnemyTransform.position.z);
EnemyDistance = Vector3.Distance(transform.position, EnemyTransform.position);
//------------------------------------------------------------------------------------------------------------------
if (TowerBool)
{
TowerDistance = Vector3.Distance(transform.position, TowerTransform.position);
TowerPosition = new Vector3(TowerTransform.position.x, transform.position.y, TowerTransform.position.z);
A = TowerDistance;
}
if (!TowerBool)
{
TowerWalk = false;
TowerFire = false;
A = 151;
TowerDistance = 151;
}
if (A >= 150)
{
TowerWalk = false;
TowerFire = false;
}
if ( A > 11 && A < 149)
{
TowerWalk = true;
TowerFire = false;
}
if (A >= 10 && A <= 15)
{
TowerWalk = false;
TowerFire = true;
}
if (A < 10)
{
TowerWalk = false;
}
//------------------------------------------------------------------------------------------------------------------
if (EnemyDistance > 20)
{
TowerBool = true;
EnemyWalk = false;
EnemyFire = false;
strife = false;
strife2 = false;
}
if (EnemyDistance <= 20 && EnemyDistance > 11)
{
EnemyWalk = true;
EnemyFire = false;
TowerWalk = false;
TowerFire = false;
strife = false;
strife2 = false;
TowerBool = false;
}
if (EnemyDistance >= 10 && EnemyDistance <= 15)
{
EnemyFire = true;
TowerWalk = false;
TowerFire = false;
strife = true;
TowerBool = false;
}
if (EnemyDistance < 10)
{
EnemyWalk = false;
}
//------------------------------------------------------------------
if (EnemyWalk)
{
transform.LookAt(EnemyPosition);
transform.position = Vector3.MoveTowards(transform.position, EnemyTransform.position, Speed * Time.deltaTime);
}
if (EnemyFire)
{
transform.LookAt(EnemyPosition);
}
//--------------------------------------------------------------
if (TowerWalk)
{
transform.LookAt(TowerPosition);
transform.position = Vector3.MoveTowards(transform.position, TowerTransform.position, Speed * Time.deltaTime);
}
if (TowerFire)
{
transform.LookAt(TowerPosition);
Rb.AddForce(transform.right * -Speed2);
Rb.AddForce(transform.forward * Speed2);
}
}
}
Kodda kullandığımız Strife Ve Strife 2 Yapay zekanın Playerin etrafında ateş ederken (Random) Rastgele hareket etmesi içindir. Bunda Düşmanın Ne Tarafa Hareket Edeceğini Kestirmekte zorlanmamızı sağlar. ve Sabit Hareketler Yapmak Yerine Sağa sola ileri Geri
Rastgele Hareket eder Ve Oyunu Starndart Olmaktan Çıkartır.
Oluşturduğumuz kodu Enemy'nin içine Atalım
Enemy Transforma karakterimizi Tower Transforma ise kuleyi Koyacağız. Speed Ve Speed2 Enemy'nin hareket etme hızıdır. Bu kısımları Dilediğiniz değeri verebilirsiniz.
Koddaki Gereken bilgileri ayarladık Artık Oyunu Başlatabiliriz.
Oyunu başlattığımızda Enemy Kulenin Yanına Gidip Etrafında dönmeye başladı Enemynin Yanına doğru yaklaştığınızda kulenin etrafında Strife(Sağa Sola Hareket etmek) Atmayı bırakıp Playere bakıp onu takip etmeye başladı Şuanda Basit Bir yapay Zeka Oluşturmuş Olduk. Ama Şuanda Enemy Ateş Etmiyor. Enemy AI GUN Girerek Dersin Devamını Uygulayabilirsiniz.