Membuat interaksi AI sederhana dengan objek lingkungan


Saat membuat kecerdasan buatan untuk video game, salah satu aspek terpenting adalah lokasinya. Posisi karakter AI dapat sepenuhnya mengubah jenis perilakunya dan keputusan di masa depan. Dalam tutorial ini kita akan memahami bagaimana lingkungan game dapat memengaruhi AI dan bagaimana menggunakannya dengan benar.

Artikel ini diambil dari buku Praktis Game AI Programming , yang ditulis oleh Michael Dagrack dan diterbitkan oleh Packt Publishing. Buku ini memungkinkan Anda mempelajari cara membuat game AI dan dari awal menerapkan algoritma AI paling canggih.

Interaksi visual adalah hal mendasar, mereka tidak secara langsung memengaruhi gameplay, tetapi memungkinkan Anda untuk meningkatkan permainan video dan karakternya dengan menjadikannya bagian dari lingkungan yang kita buat, yang sangat memengaruhi perendaman pemain dalam permainan. Ini membuktikan kepada kita pentingnya lingkungan menjadi bagian dari permainan, dan tidak hanya membantu mengisi ruang di layar. Interaksi serupa semakin banyak ditemukan dalam permainan, dan pemain berharap melihatnya. Jika ada objek dalam permainan, maka itu harus memenuhi beberapa fungsi, meskipun bukan yang paling penting.

Salah satu contoh pertama interaksi dengan lingkungan dapat ditemukan di Castlevania pertama, yang dirilis pada tahun 1986 untuk Nintendo Entertainment System. Sejak awal, pemain dapat menggunakan cambuk untuk menghancurkan lilin dan api, yang awalnya merupakan bagian dari latar belakang.


Ini dan beberapa permainan pada waktu itu membuka banyak pintu dan peluang dalam hal persepsi modern tentang latar belakang dan lingkungan karakter dalam permainan. Jelas, karena keterbatasan perangkat keras dari generasi konsol itu, itu jauh lebih sulit untuk membuat hal-hal sederhana yang umumnya diterima oleh standar saat ini. Tetapi setiap generasi konsol menghadirkan fitur baru dan pengembang menggunakannya untuk membuat game yang luar biasa.

Jadi, contoh pertama kami interaksi visual adalah objek di latar belakang yang dapat dihancurkan tanpa secara langsung mempengaruhi gameplay. Jenis interaksi ini ditemukan di banyak permainan. Menerapkannya sederhana, hanya menghidupkan objek ketika diserang. Setelah itu, kita dapat memutuskan apakah ada poin atau benda yang harus dijatuhkan dari benda yang memberi hadiah kepada pemain untuk menjelajahi permainan.

Sekarang kita bisa beralih ke contoh berikutnya - objek dalam game yang dianimasikan atau dipindahkan ketika karakter melewatinya. Prinsipnya di sini sama dengan benda-benda yang dapat dirusak, tetapi kali ini interaksinya lebih halus - memerlukan karakter untuk bergerak ke titik di mana objek itu berada. Ini dapat diterapkan pada berbagai elemen permainan, mulai dari pergerakan rumput, debu atau air, hingga burung terbang atau orang yang membuat gerakan lucu; kemungkinannya tidak terbatas.

Ketika menganalisis interaksi ini, kita dapat dengan mudah menentukan bahwa mereka tidak perlu menggunakan AI, dan dalam kebanyakan kasus itu hanya fungsi Boolean yang diaktifkan sesuai dengan beberapa tindakan yang diberikan. Tetapi mereka adalah bagian dari lingkungan dan karenanya harus diperhitungkan ketika menerapkan interaksi berkualitas tinggi antara lingkungan dan AI.

Buat interaksi sederhana dengan lingkungan


Seperti yang telah kita lihat, lingkungan pernah menjadi bagian dari gameplay, dan ini memunculkan banyak konsep dan ide baru untuk game masa depan. Langkah selanjutnya adalah integrasi perubahan kecil ini dalam gameplay dan penggunaannya untuk mengubah perilaku pemain dalam game. Hal ini jelas memengaruhi sejarah video game, karena semua elemen adegan secara bertahap mulai hidup kembali dan pemain mulai menyadari betapa kaya lingkungannya. Menggunakan lingkungan untuk mencapai tujuan dalam game telah menjadi bagian dari gameplay.


Untuk menunjukkan satu contoh lingkungan yang secara langsung memengaruhi gameplay, kami akan mengambil contoh yang bagus - franchise Tomb Raider. Dalam contoh ini, karakter kita, Lara Croft, harus mendorong kubus hingga mendarat di area yang ditandai. Ini akan mengubah lingkungan dan membuka jalur baru, memungkinkan pemain untuk bergerak lebih jauh dalam level.

Teka-teki semacam itu dapat ditemukan di banyak permainan: Anda harus melakukan suatu tindakan pada titik tertentu di peta sehingga sesuatu terjadi di bagian lain dari itu, dan ini dapat digunakan untuk mencapai beberapa tujuan dalam permainan. Biasanya kita perlu mengubah lingkungan itu sendiri untuk maju lebih jauh di level. Oleh karena itu, ketika pengembang merencanakan peta atau level, mereka mempertimbangkan ini dan membuat semua aturan yang terkait dengan setiap interaksi. Contohnya:

if(cube.transform.position == mark.transform.position)
{
  openDoor = true;
}

Sekarang bayangkan sejenak bahwa Lara Croft memiliki karakter sekutu yang tugas utamanya adalah membantunya meletakkan kotak ini di tempatnya. Dan dalam bab ini kita akan mempertimbangkan jenis interaksi ini saja: karakter AI memahami bagaimana lingkungan bekerja dan bagaimana menggunakannya.

Lingkungan Pindah di Tomb Raider


Mari kita langsung ke skenario ini dan mencoba untuk menciptakan kembali situasi di mana ada karakter AI yang dapat membantu pemain mencapai tujuannya. Dalam contoh ini, kita akan membayangkan bahwa seorang pemain terjebak dari mana ia tidak bisa mendapatkan akses ke objek interaktif yang dapat membebaskannya. Karakter yang kita buat harus dapat menemukan kubus dan mendorongnya ke arah yang benar.


Jadi sekarang kita memiliki semua karakter dan objek. Mari kita rencanakan bagaimana karakter AI seharusnya berperilaku dalam situasi ini. Pertama, ia harus melihat bahwa pemainnya dekat, sehingga ia dapat mulai mencari dan memindahkan kubus ke posisi yang diinginkan. Asumsikan bahwa jika kubus berada di sasaran, maka blok baru muncul dari pasir, memungkinkan pemain untuk maju lebih jauh dalam level. Karakter AI dapat mendorong kubus ke empat arah: kiri, kanan, maju dan mundur, sehingga cocok dengan tanda posisi.


Karakter AI harus memverifikasi dan memvalidasi setiap tindakan yang ditampilkan di pohon perilaku ini. Hal pertama dan paling penting untuk melanjutkan tugas adalah bahwa karakter harus yakin bahwa pemain berada pada tandanya.

Jika pemain belum sampai di sana, maka karakter kita harus menunggu dan tetap di tempatnya. Jika pemain telah tiba di sasaran, maka karakter AI melanjutkan eksekusi dan bertanya pada dirinya sendiri seberapa jauh dia dari objek kubus. Jika tidak, maka karakter harus bergerak ke arah kubus, dan setelah tindakan ini dikonfirmasi, ia harus mengajukan pertanyaan yang sama. Ketika jawabannya menjadi positif dan karakter berada di sebelah kubus, ia harus mencari tahu ke mana Anda harus mendorong kubus terlebih dahulu.

Kemudian dia mulai mendorong kubus sepanjang sumbu Y atau X sampai cocok dengan posisi menandai dan tugas selesai.

public GameObject playerMesh;
public Transform playerMark;
public Transform cubeMark;
public Transform currentPlayerPosition;
public Transform currentCubePosition;

public float proximityValueX;
public float proximityValueY;
public float nearValue;

private bool playerOnMark;


void Start () {

}

void Update () {

  // Calculates the current position of the player
  currentPlayerPosition.transform.position = playerMesh.transform.position;

  // Calculates the distance between the player and the player mark of the X axis
  proximityValueX = playerMark.transform.position.x - currentPlayerPosition.transform.position.x;

  // Calculates the distance between the player and the player mark of the Y axis
  proximityValueYplayerMark.transform.position.y - currentPlayerPosition.transform.position.y;

  // Calculates if the player is near of his MARK POSITION
  if((proximityValueX + proximityValueY) < nearValue)
  {
     playerOnMark = true;
  }
}

Kami mulai menambahkan informasi ke kode yang memungkinkan karakter untuk memeriksa apakah pemain di sebelah posisi yang ditandai. Untuk melakukan ini, kami membuat semua variabel yang diperlukan untuk menghitung jarak antara pemain dan posisi di mana ia seharusnya berada. playerMeshmengacu pada model 3D pemain, dari mana kami mengekstrak posisinya dan menggunakannya sebagai currentPlayerPosition.

Untuk mengetahui apakah itu dekat dengan tanda, kita perlu variabel yang mewakili posisi tanda, dan dalam contoh kita, kita membuat variabel playerMarkdi mana kita dapat menulis posisi di mana pemain seharusnya berada. Kemudian kami menambahkan tiga variabel yang memberi tahu kami jika ada pemain di dekatnya. proximityValueXakan menghitung jarak antara pemain dan tanda sumbu X. proximityValueYmenghitung jarak antara pemain dan tanda sumbu Y.

Selanjutnya, kita miliki nearValue, di mana kita dapat menentukan seberapa jauh pemain bisa dari posisi tanda, ketika karakter AI dapat mulai bekerja untuk mencapai tujuan. Begitu pemain mendekati tanda, variabel Boolean playerOnMarkmengubah nilai menjadi true.

Untuk menghitung jarak antara pemain dan tanda, kami menggunakan yang berikut: jarak antara pemain dan tanda-nya, serupa (mark.position - player.position).

Sekarang, untuk menentukan apakah karakter AI dekat kubus, kita menghitung persamaan yang sama dengan menghitung jarak antara AI dan kubus. Selain itu, kami menambahkan kode dengan posisi pada kedua nilai (pemain dan kubus):

public GameObject playerMesh;
public Transform playerMark;
public Transform cubeMark;
public Transform currentPlayerPosition;
public Transform currentCubePosition;

public float proximityValueX;
public float proximityValueY;
public float nearValue;

public float cubeProximityX;
public float cubeProximityY;
public float nearCube;

private bool playerOnMark;
private bool cubeIsNear;


void Start () {

   Vector3 playerMark = new Vector3(81.2f, 32.6f, -31.3f);
   Vector3 cubeMark = new Vector3(81.9f, -8.3f, -2.94f);
   nearValue = 0.5f;
   nearCube = 0.5f;
}

void Update () {

  // Calculates the current position of the player
  currentPlayerPosition.transform.position = playerMesh.transform.position;

  // Calculates the distance between the player and the player mark of the X axis
  proximityValueX = playerMark.transform.position.x - currentPlayerPosition.transform.position.x;

  // Calculates the distance between the player and the player mark of the Y axis
  proximityValueY = playerMark.transform.position.y - currentPlayerPosition.transform.position.y;

  // Calculates if the player is near of his MARK POSITION
  if((proximityValueX + proximityValueY) < nearValue)
  {
     playerOnMark = true;
  }

  cubeProximityX = currentCubePosition.transform.position.x - this.transform.position.x;
  cubeProximityY = currentCubePosition.transform.position.y - this.transform.position.y;

  if((cubeProximityX + cubeProximityY) < nearCube)
  {
     cubeIsNear = true;
  }

  else
  {
     cubeIsNear = false;
  }
}

Sekarang karakter AI kita tahu apakah dia ada di sebelah kubus, ini memungkinkan kita untuk menjawab pertanyaan dan menentukan apakah dia bisa pindah ke cabang berikutnya yang kita rencanakan. Tetapi apa yang terjadi ketika karakter tidak di sebelah kubus? Dia harus mendekati kubus. Karena itu, kami akan menambahkan ini ke kode:

public GameObject playerMesh;
public Transform playerMark;
public Transform cubeMark;
public Transform cubeMesh;
public Transform currentPlayerPosition;
public Transform currentCubePosition;

public float proximityValueX;
public float proximityValueY;
public float nearValue;

public float cubeProximityX;
public float cubeProximityY;
public float nearCube;

private bool playerOnMark;
private bool cubeIsNear;

public float speed;
public bool Finding;


void Start () {

   Vector3 playerMark = new Vector3(81.2f, 32.6f, -31.3f);
   Vector3 cubeMark = new Vector3(81.9f, -8.3f, -2.94f);
   nearValue = 0.5f;
   nearCube = 0.5f;
   speed = 1.3f;
}

void Update () {

  // Calculates the current position of the player
  currentPlayerPosition.transform.position = playerMesh.transform.position;

  // Calculates the distance between the player and the player mark of the X axis
  proximityValueX = playerMark.transform.position.x - currentPlayerPosition.transform.position.x;

  // Calculates the distance between the player and the player mark of the Y axis
  proximityValueY = playerMark.transform.position.y - currentPlayerPosition.transform.position.y;

  // Calculates if the player is near of his MARK POSITION
  if((proximityValueX + proximityValueY) < nearValue)
  { 
      playerOnMark = true;
  }

  cubeProximityX = currentCubePosition.transform.position.x - this.transform.position.x;
  cubeProximityY = currentCubePosition.transform.position.y - this.transform.position.y;

  if((cubeProximityX + cubeProximityY) < nearCube)
  {
      cubeIsNear = true;
  }

  else
  {
      cubeIsNear = false;
  }

  if(playerOnMark == true && cubeIsNear == false && Finding == false)
  {
     PositionChanging();
  }

  if(playerOnMark == true && cubeIsNear == true)
  {
     Finding = false;
  }

}

void PositionChanging () {

  Finding = true;
  Vector3 positionA = this.transform.position;
  Vector3 positionB = cubeMesh.transform.position;
  this.transform.position = Vector3.Lerp(positionA, positionB, Time.deltaTime * speed);
}

Sejauh ini, karakter AI kami dapat menghitung jarak antara dirinya dan kubus; jika mereka terlalu jauh, maka dia akan pergi ke kubus. Setelah menyelesaikan tugas ini, ia dapat melanjutkan ke fase berikutnya dan mulai mendorong kubus. Hal terakhir yang perlu ia hitung adalah seberapa jauh kubus dari posisi tanda, setelah itu ia memutuskan cara mendorong, dengan mempertimbangkan sisi kubus mana yang lebih dekat dengan tanda itu.


Kubus hanya dapat didorong sepanjang sumbu X dan Z, dan rotasinya belum penting bagi kami, karena tombol diaktifkan ketika kubus dipasang di atasnya. Mengingat semua ini, karakter AI harus menghitung seberapa jauh kubus dari posisi tanda pada X dan posisi tanda pada Z.

Kemudian ia membandingkan dua nilai pada dua sumbu dan memilih mana yang lebih jauh dari posisi yang diinginkan, dan kemudian mulai mendorong sepanjang ini sumbu. Karakter akan terus mendorong ke arah ini sampai kubus disejajarkan dengan posisi tanda, dan kemudian beralih ke sisi lain, dan akan mendorongnya sampai benar-benar melewati posisi tanda:

public GameObject playerMesh;
public Transform playerMark;
public Transform cubeMark;
public Transform cubeMesh;
public Transform currentPlayerPosition;
public Transform currentCubePosition;

public float proximityValueX;
public float proximityValueY;
public float nearValue;

public float cubeProximityX;
public float cubeProximityY;
public float nearCube;

public float cubeMarkProximityX;
public float cubeMarkProximityZ;

private bool playerOnMark;
private bool cubeIsNear;

public float speed;
public bool Finding;


void Start () {

        Vector3 playerMark = new Vector3(81.2f, 32.6f, -31.3f);
        Vector3 cubeMark = new Vector3(81.9f, -8.3f, -2.94f);
        nearValue = 0.5f;
        nearCube = 0.5f;
        speed = 1.3f;
}

void Update () {

  // Calculates the current position of the player
  currentPlayerPosition.transform.position = playerMesh.transform.position;

  // Calculates the distance between the player and the player mark of the X axis
  proximityValueX = playerMark.transform.position.x - currentPlayerPosition.transform.position.x;

  // Calculates the distance between the player and the player mark of the Y axis
  proximityValueY = playerMark.transform.position.y - currentPlayerPosition.transform.position.y;

  // Calculates if the player is near of his MARK POSITION
  if((proximityValueX + proximityValueY) < nearValue)
  {
     playerOnMark = true;
  }

  cubeProximityX = currentCubePosition.transform.position.x - this.transform.position.x;
  cubeProximityY = currentCubePosition.transform.position.y - this.transform.position.y;

  if((cubeProximityX + cubeProximityY) < nearCube)
  {
     cubeIsNear = true;
  }

  else
  {
     cubeIsNear = false;
  }

  if(playerOnMark == true && cubeIsNear == false && Finding == false)
  {
      PositionChanging();
  }

  if(playerOnMark == true && cubeIsNear == true)
  {
      Finding = false;
    }

   cubeMarkProximityX = cubeMark.transform.position.x - currentCubePosition.transform.position.x;
   cubeMarkProximityZ = cubeMark.transform.position.z - currentCubePosition.transform.position.z;

   if(cubeMarkProximityX > cubeMarkProximityZ)
   {
     PushX();
   }

   if(cubeMarkProximityX < cubeMarkProximityZ)
   {
     PushZ();
   }

}

void PositionChanging () {

  Finding = true;
  Vector3 positionA = this.transform.position;
  Vector3 positionB = cubeMesh.transform.position;
  this.transform.position = Vector3.Lerp(positionA, positionB, Time.deltaTime * speed);
}

Setelah menambahkan tindakan terbaru ke kode, karakter harus belajar untuk menentukan tujuannya, menemukan dan mendorong kubus ke posisi yang diinginkan sehingga pemain dapat melewati dan menyelesaikan level. Dalam contoh ini, kami fokus pada cara menghitung jarak antara objek adegan dan karakter. Ini akan membantu kita untuk membuat jenis interaksi serupa di mana kita perlu menempatkan objek game di posisi tertentu.

Contoh tersebut menunjukkan karakter AI yang ramah yang membantu pemain, tetapi prinsip yang sama dapat diterapkan jika kita membutuhkan efek sebaliknya (jika karakter tersebut adalah musuh), di mana karakter perlu menemukan kubus sesegera mungkin untuk menghentikan pemain.

Rintangan benda-benda di lingkungan menggunakan contoh Age of Empires


Seperti yang kita lihat sebelumnya, Anda dapat menggunakan atau memindahkan objek dalam permainan untuk mencapai tujuan, tetapi apa yang terjadi jika beberapa objek menghalangi jalur karakter? Objek dapat ditempatkan oleh pemain atau hanya terletak oleh perancang di posisi peta ini. Bagaimanapun, karakter AI harus dapat menentukan apa yang perlu dilakukan dalam situasi ini.

Kita dapat mengamati perilaku ini, misalnya, dalam strategi yang disebut Age of Empires II yang dikembangkan oleh Ensemble Studios. Setiap kali karakter permainan tidak dapat mencapai wilayah musuh karena fakta bahwa itu dikelilingi oleh tembok yang diperkuat, AI beralih ke menghancurkan bagian dinding untuk melanjutkan.

Jenis interaksi ini juga sangat cerdas dan penting, karena jika tidak, karakter hanya akan berkeliaran di sepanjang dinding untuk mencari pintu masuk, dan ini tidak akan terlihat seperti perilaku yang masuk akal. Karena dinding yang diperkuat dibuat oleh pemain, itu dapat ditempatkan di mana saja dan memiliki bentuk apa pun. Karena itu, Anda perlu memikirkan hal ini ketika mengembangkan AI musuh.


Contoh ini juga berhubungan dengan topik artikel kami, karena pada tahap perencanaan, ketika kita membuat pohon perilaku, kita perlu berpikir tentang apa yang akan terjadi jika sesuatu menghalangi karakter dan dia tidak dapat memenuhi tujuannya. Kami akan mempertimbangkan aspek ini secara rinci dalam bab-bab selanjutnya dari buku ini, tetapi untuk saat ini kami menyederhanakan situasi dan menganalisis bagaimana karakter AI seharusnya berperilaku jika objek lingkungan mencegahnya dari memenuhi tujuannya.


Dalam contoh kita, karakter AI harus memasuki rumah, tetapi ketika dia mendekat, dia menyadari bahwa dia dikelilingi oleh pagar kayu, yang melaluinya kamu tidak bisa melewatinya. Kami ingin karakter untuk memilih target pada tahap ini dan mulai menyerang sampai bagian pagar ini dihancurkan dan dia dapat memasuki rumah.

Dalam contoh ini, kita perlu menghitung pagar mana yang harus diserang karakter, mengingat jarak dan status kesehatan pagar saat ini. Pagar dengan HP rendah harus memiliki prioritas serangan yang lebih tinggi daripada pagar dengan HP penuh, jadi kami akan memperhitungkan ini dalam perhitungan kami.


Kami ingin mengatur lingkungan di sekitar karakter, di mana pagar terdekat mengirimkan informasi mereka ke kecerdasan buatan sehingga dapat memutuskan mana yang lebih mudah dihancurkan. Ini dapat diimplementasikan dengan berbagai cara, baik menggunakan pengakuan tabrakan pagar dengan pemain, atau memaksa mereka untuk menghitung jarak antara pagar / objek dan pemain; kami menetapkan nilai jarak di mana pemain mulai memahami kondisi pagar. Dalam contoh kami, kami akan menghitung jarak dan menggunakannya untuk memberi tahu karakter tentang pagar HP.

Mari kita mulai dengan membuat kode yang akan diterapkan pada objek pagar; semuanya akan memiliki skrip yang sama:

public float HP;
public float distanceValue;
private Transform characterPosition;
private GameObject characterMesh;

private float proximityValueX;
private float proximityValueY;
private float nearValue;

// Use this for initialization
void Start () {

  HP = 100f;
  distanceValue = 1.5f;

  // Find the Character Mesh
  characterMesh = GameObject.Find("AICharacter");
}

// Update is called once per frame
void Update () {

  // Obtain the Character Mesh Position
  characterPosition = characterMesh.transform;

  //Calculate the distance between this object and the AI Character
  proximityValueX = characterPosition.transform.position.x - this.transform.position.x;
  proximityValueY = characterPosition.transform.position.y - this.transform.position.y;

  nearValue = proximityValueX + proximityValueY;
}

Dalam skrip ini, kami menambahkan informasi dasar tentang HP dan jarak, yang akan digunakan untuk terhubung dengan karakter AI. Kali ini kami menambahkan skrip penghitung jarak tidak ke karakter, tetapi ke objek lingkungan; ini memberi objek lebih banyak dinamisme dan memungkinkan kita menciptakan lebih banyak peluang.

Misalnya, jika karakter permainan juga terlibat dalam pembuatan pagar, maka mereka akan memiliki status yang berbeda, misalnya, "sedang dibangun", "selesai" atau "rusak"; maka karakter akan dapat menerima informasi ini dan menggunakannya untuk tujuan mereka sendiri.

Mari kita mengatur karakter yang berinteraksi dengan objek lingkungan. Tujuan utamanya adalah untuk mendapatkan akses ke rumah, tetapi ketika dia mendekatinya, dia menyadari bahwa dia tidak bisa masuk karena fakta bahwa dia dikelilingi oleh pagar kayu. Kami ingin itu, setelah menganalisis situasinya, karakter kami akan menghancurkan pagar untuk memenuhi tujuannya dan masuk ke rumah.

Dalam skrip karakter, kami akan menambahkan fungsi statis, ke input yang mana pagar akan dapat mengirimkan informasi tentang "kesehatan" mereka saat ini; ini akan membantu karakter memilih pagar yang paling cocok untuk dihancurkan.

public static float fenceHP;
public static float lowerFenceHP;
public static float fencesAnalyzed;
public static GameObject bestFence;

private Transform House;

private float timeWasted;
public float speed;



void Start () {

        fenceHP = 100f;
        lowerFenceHP = fenceHP;
        fencesAnalyzed = 0;
        speed = 0.8;

        Vector3 House = new Vector3(300.2f, 83.3f, -13.3f);

}

void Update () {

        timeWasted += Time.deltaTime;

        if(fenceHP > lowerFenceHP)
        {
            lowerFenceHP = fenceHP;
        }

        if(timeWasted > 30f)
        {
            GoToFence();  
        }
}

void GoToFence() {

        Vector3 positionA = this.transform.position;
        Vector3 positionB = bestFence.transform.position;
        this.transform.position = Vector3.Lerp(positionA, positionB, Time.deltaTime * speed);
}


Kami telah menambahkan informasi paling mendasar ke karakter. fenceHPakan menjadi variabel statis di mana setiap pagar yang berada dalam radius lingkungan karakter akan mencatat informasi tentang HP saat ini. Kemudian karakter AI menganalisis informasi yang diterima dan membandingkannya dengan pagar dengan HP paling sedikit disajikan lowerFenceHP.

Karakter memiliki variabel yang timeWastedmewakili jumlah detik yang telah dihabiskannya mencari pagar yang sesuai untuk dihancurkan. fencesAnalyzedakan digunakan untuk mencari tahu apakah sudah ada pagar dalam kode, dan jika tidak, pagar pertama yang ditemukan oleh karakter ditambahkan; dalam kasus pagar memiliki nilai HP yang sama, karakter menyerang mereka terlebih dahulu. Sekarang mari kita tambahkan kode pagar sehingga mereka dapat mengakses skrip karakter dan memasukkan informasi yang berguna.

public float HP;
public float distanceValue;
private Transform characterPosition;
private GameObject characterMesh;

private float proximityValueX;
private float proximityValueY;
private float nearValue;
void Start () {

        HP = 100f;
        distanceValue = 1.5f;

        // Find the Character Mesh
        characterMesh = GameObject.Find("AICharacter");
}

void Update () {

        // Obtain the Character Mesh Position
        characterPosition = characterMesh.transform;

        //Calculate the distance between this object and the AI Character
        proximityValueX = characterPosition.transform.position.x - this.transform.position.x;
        proximityValueY = characterPosition.transform.position.y - this.transform.position.y;

        nearValue = proximityValueX + proximityValueY;

        if(nearValue <= distanceValue){
            if(AICharacter.fencesAnalyzed == 0){
                AICharacter.fencesAnalyzed = 1;
                AICharacter.bestFence = this.gameObject;
            }

            AICharacter.fenceHP = HP;

            if(HP < AICharacter.lowerFenceHP){
                AICharacter.bestFence = this.gameObject;
            }
        }
}

Kami akhirnya melengkapi contoh ini. Sekarang pagar membandingkan HP saat ini dengan data karakter ( lowerFenceHP), dan jika HPnya lebih rendah dari nilai terendah yang dimiliki karakter, maka pagar ini akan dipertimbangkan bestFence.

Contoh ini menunjukkan bagaimana mengadaptasi karakter AI ke berbagai objek dinamis dalam game; prinsip yang sama dapat diperluas dan digunakan untuk berinteraksi dengan hampir semua objek. Itu juga berlaku dan berguna ketika menggunakan objek untuk berinteraksi dengan karakter, menghubungkan informasi di antara mereka.

Dalam posting ini, kami mengeksplorasi berbagai cara berinteraksi dengan lingkungan. Teknik yang diperlihatkan dalam bab ini dapat diperluas ke berbagai genre permainan dan digunakan untuk melakukan interaksi sederhana dan kompleks antara karakter AI dan lingkungan.

All Articles