昨天的AI已經列出幾種技能使用的策略,今天可以開始來實作了。但我不太知道要用什麼樣的架構寫,所以我先請ChatGPT給我幾個方向。
給我幾種適合寫這種ai的程式架構
當設計一個簡單的 AI 系統時,針對你提到的「基於規則的技能使用 AI」,有幾種常見的程式架構可以用來實現這種行為。這些架構可以幫助你保持代碼的結構清晰、擴展方便,同時讓 AI 的邏輯簡單明瞭。以下是幾種適合這類 AI 編寫的程式架構:
這是最簡單且常見的 AI 編寫方式,適合簡單的 AI 行為。通過 if-else
或 switch-case
來根據條件選擇合適的技能。
public class AIController : MonoBehaviour
{
public Character aiCharacter;
public Character player;
void Update()
{
if (aiCharacter.Health < 20 && aiCharacter.Mana > 40)
{
// 使用治癒技能
UseHeal();
}
else if (aiCharacter.Health < 30)
{
// 使用防禦技能
UseShield();
}
else if (player.Health < 50 && aiCharacter.Mana > 30)
{
// 使用高傷害技能
UsePowerStrike();
}
else
{
// 普通攻擊
UseBasicAttack();
}
}
void UseHeal() { /* Heal logic */ }
void UseShield() { /* Shield logic */ }
void UsePowerStrike() { /* Power Strike logic */ }
void UseBasicAttack() { /* Basic Attack logic */ }
}
狀態機是一種適合處理不同狀態之間轉換的架構。AI 在不同的狀態(例如攻擊、防禦、恢復)之間進行切換,每個狀態都有不同的行為邏輯。
public enum AIState
{
Attack,
Defend,
Heal
}
public class AIController : MonoBehaviour
{
public Character aiCharacter;
public Character player;
private AIState currentState;
void Start()
{
currentState = AIState.Attack; // 初始狀態為攻擊
}
void Update()
{
switch (currentState)
{
case AIState.Attack:
if (player.Health < 50)
{
UsePowerStrike();
}
else
{
UseBasicAttack();
}
if (aiCharacter.Health < 30)
{
currentState = AIState.Defend; // 切換到防禦狀態
}
break;
case AIState.Defend:
UseShield();
if (aiCharacter.Health < 20)
{
currentState = AIState.Heal; // 切換到治癒狀態
}
break;
case AIState.Heal:
UseHeal();
if (aiCharacter.Health > 50)
{
currentState = AIState.Attack; // 切換回攻擊狀態
}
break;
}
}
void UseHeal() { /* Heal logic */ }
void UseShield() { /* Shield logic */ }
void UsePowerStrike() { /* Power Strike logic */ }
void UseBasicAttack() { /* Basic Attack logic */ }
}
行為樹是比狀態機更靈活的 AI 架構,使用樹狀結構來組織 AI 的行為決策。樹的每個節點代表一個行為,根據當前情況選擇執行的分支。
public class AIController : MonoBehaviour
{
public Character aiCharacter;
public Character player;
void Update()
{
// 行為樹的根節點
if (aiCharacter.Health < 20 && aiCharacter.Mana > 40)
{
UseHeal(); // 假設治癒是優先級最高的行為
}
else if (aiCharacter.Health < 30)
{
UseShield(); // 如果AI快死了,則進行防禦
}
else
{
if (player.Health < 50 && aiCharacter.Mana > 30)
{
UsePowerStrike(); // 優先使用高傷害技能
}
else
{
UseBasicAttack(); // 否則進行普通攻擊
}
}
}
void UseHeal() { /* Heal logic */ }
void UseShield() { /* Shield logic */ }
void UsePowerStrike() { /* Power Strike logic */ }
void UseBasicAttack() { /* Basic Attack logic */ }
}
策略模式允許你將不同的技能使用策略封裝在獨立的類中,AI 可以根據當前的情況選擇合適的策略來使用技能。
public interface ISkillStrategy
{
void Execute(Character aiCharacter, Character player);
}
public class BasicAttackStrategy : ISkillStrategy
{
public void Execute(Character aiCharacter, Character player)
{
// 實現普通攻擊邏輯
}
}
public class PowerStrikeStrategy : ISkillStrategy
{
public void Execute(Character aiCharacter, Character player)
{
// 實現高傷害攻擊邏輯
}
}
public class AIController : MonoBehaviour
{
private ISkillStrategy currentStrategy;
public Character aiCharacter;
public Character player;
void Start()
{
currentStrategy = new BasicAttackStrategy(); // 初始策略
}
void Update()
{
if (aiCharacter.Health < 50 && aiCharacter.Mana > 30)
{
currentStrategy = new PowerStrikeStrategy(); // 切換策略
}
else
{
currentStrategy = new BasicAttackStrategy(); // 回到普通攻擊
}
// 執行當前策略
currentStrategy.Execute(aiCharacter, player);
}
}
這種方法允許你根據一個配置表來定義AI的行為和技能選擇。可以將AI的規則和邏輯放在一個數據表中,然後在遊戲中解析這些數據,讓AI做出行動決策。
public class AIController : MonoBehaviour
{
public Character aiCharacter;
public Character player;
private Dictionary<string, string> skillTable = new Dictionary<string, string>
{
{"lowHealth", "Heal"},
{"midHealth", "Shield"},
{"highMana", "PowerStrike"},
{"default", "BasicAttack"}
};
void Update()
{
if (aiCharacter.Health < 20)
{
UseSkill(skillTable["lowHealth"]);
}
else if (aiCharacter.Health < 50)
{
UseSkill(skillTable["midHealth"]);
}
else if (aiCharacter.Mana > 30)
{
UseSkill(skillTable["highMana"]);
}
else
{
UseSkill(skillTable["default"]);
}
}
void UseSkill(string skill)
{
switch (skill)
{
case "Heal":
// 使用治癒技能
break;
case "Shield":
// 使用防禦技能
break;
case "PowerStrike":
// 使用高傷害技能
break;
case "BasicAttack":
// 使用普通攻擊
break;
}
}
}
If-Else
結構:簡單易實現,適合小規模的AI邏輯。