iT邦幫忙

2024 iThome 鐵人賽

DAY 30
0
生成式 AI

生成式AI輔助電子遊戲製作系列 第 30

D30 /修昨天的技能bug

  • 分享至 

  • xImage
  •  

昨天的文章中,已經把敵人技能的code實做出來了,但ChatGPT並沒有造先前的skill的interface來寫,所以發生一些錯誤,我們請ChatGPT修正一下code。

根據你提供的 ISkill 接口和 Character 類,我可以基於這個架構為暗影刺客(Shadow Assassin)設計技能。同時,為了適應你的技能接口,這些技能將包含魔法消耗(ManaCost)、冷卻時間(Cooldown),以及檢查技能是否能夠使用(CanUseSkill)。

1. 致命一擊(Fatal Strike)

public class FatalStrike : ISkill
{
    public string SkillName => "Fatal Strike";
    public int ManaCost => 20;
    public int Cooldown => 5;
    public int CurrentCooldown { get; set; }

    public void UseSkill(Character target)
    {
        // 如果冷卻時間未滿,不能使用技能
        if (CurrentCooldown > 0)
        {
            Debug.Log($"{SkillName} is on cooldown for {CurrentCooldown} more turns.");
            return;
        }

        float damage = 40; // 假設造成固定的 40 點傷害
        target.TakeDamage(damage);

        // 如果目標的血量低於 20%,直接擊殺
        if (target.Health < target.Health * 0.2f)
        {
            Debug.Log("Fatal Strike: Instant kill activated!");
            target.Health = 0;
        }

        // 重置冷卻時間
        CurrentCooldown = Cooldown;
        Debug.Log($"{SkillName} is used on {target.Name}. Cooldown is now {Cooldown} turns.");
    }

    public bool CanUseSkill(int currentMana)
    {
        return currentMana >= ManaCost && CurrentCooldown == 0;
    }
}

2. 暗影隱身(Shadow Cloak)

public class ShadowCloak : ISkill
{
    public string SkillName => "Shadow Cloak";
    public int ManaCost => 15;
    public int Cooldown => 6;
    public int CurrentCooldown { get; set; }

    public void UseSkill(Character user)
    {
        if (CurrentCooldown > 0)
        {
            Debug.Log($"{SkillName} is on cooldown for {CurrentCooldown} more turns.");
            return;
        }

        // 暗影隱身效果,提升攻擊力並設置隱身
        Debug.Log($"{user.Name} has become invisible!");
        // 假設玩家進入隱身狀態的代碼和邏輯(如攻擊力提升)

        // 重置冷卻時間
        CurrentCooldown = Cooldown;
    }

    public bool CanUseSkill(int currentMana)
    {
        return currentMana >= ManaCost && CurrentCooldown == 0;
    }
}

3. 毒刃(Poisoned Blade)

public class PoisonedBlade : ISkill
{
    public string SkillName => "Poisoned Blade";
    public int ManaCost => 10;
    public int Cooldown => 4;
    public int CurrentCooldown { get; set; }

    public void UseSkill(Character target)
    {
        if (CurrentCooldown > 0)
        {
            Debug.Log($"{SkillName} is on cooldown for {CurrentCooldown} more turns.");
            return;
        }

        // 對目標施加持續毒性傷害
        Debug.Log($"{target.Name} is poisoned! Will take poison damage over time.");
        // 假設目標中毒的代碼(例如在每回合生效的傷害邏輯)

        // 重置冷卻時間
        CurrentCooldown = Cooldown;
    }

    public bool CanUseSkill(int currentMana)
    {
        return currentMana >= ManaCost && CurrentCooldown == 0;
    }
}

Character 使用技能

Character 使用技能時,我們需要檢查魔法值和冷卻時間是否允許。這裡是一個簡單的使用技能流程:

public class PlayerController : MonoBehaviour
{
    public Character player;
    public Character enemy;

    private ISkill fatalStrike;
    private ISkill shadowCloak;
    private ISkill poisonedBlade;

    void Start()
    {
        player = new Character("Shadow Assassin", 100, 50);
        enemy = new Character("Enemy", 120, 30);

        fatalStrike = new FatalStrike();
        shadowCloak = new ShadowCloak();
        poisonedBlade = new PoisonedBlade();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Alpha1))
        {
            // 使用致命一擊
            if (fatalStrike.CanUseSkill((int)player.Mana))
            {
                fatalStrike.UseSkill(enemy);
                player.UseMana(fatalStrike.ManaCost);
            }
            else
            {
                Debug.Log("Not enough mana or skill is on cooldown.");
            }
        }

        if (Input.GetKeyDown(KeyCode.Alpha2))
        {
            // 使用暗影隱身
            if (shadowCloak.CanUseSkill((int)player.Mana))
            {
                shadowCloak.UseSkill(player);
                player.UseMana(shadowCloak.ManaCost);
            }
            else
            {
                Debug.Log("Not enough mana or skill is on cooldown.");
            }
        }

        if (Input.GetKeyDown(KeyCode.Alpha3))
        {
            // 使用毒刃
            if (poisonedBlade.CanUseSkill((int)player.Mana))
            {
                poisonedBlade.UseSkill(enemy);
                player.UseMana(poisonedBlade.ManaCost);
            }
            else
            {
                Debug.Log("Not enough mana or skill is on cooldown.");
            }
        }

        // 每回合減少技能冷卻時間
        fatalStrike.CurrentCooldown = Mathf.Max(fatalStrike.CurrentCooldown - 1, 0);
        shadowCloak.CurrentCooldown = Mathf.Max(shadowCloak.CurrentCooldown - 1, 0);
        poisonedBlade.CurrentCooldown = Mathf.Max(poisonedBlade.CurrentCooldown - 1, 0);
    }
}

小結

現在每個技能都有以下屬性:

  • SkillName:技能名稱。
  • ManaCost:施放技能所需的魔法值。
  • Cooldown:技能的冷卻時間。
  • CurrentCooldown:當前冷卻時間,會在每回合進行減少。

在遊戲中,玩家可以通過檢查 CanUseSkill 來確定技能是否可用,並在每回合結束時更新冷卻時間。這個設計簡單而靈活,適合擴展到更多技能和角色。


在鐵人賽的最後,附上這次專案的GitHub連結,ChatGPT的聊天紀錄因為有用到生圖的功能就沒版法分享出來了。雖然最後並沒有把整個專案做完,但還是可以看到如果有一定的程式基礎,在實作專案時使用生成式AI是可以提高效率的,但在生出來的code上還是會有蠻多bug要修改的,如果不喜歡做Code Review可能也不太適合利用生成式AI來寫code。因為遊戲的雛形已經差不多完成了,之後有時間應該會把遊戲做完,再上傳到網頁讓大家試玩!


上一篇
D29 /暗影刺客技能實做
系列文
生成式AI輔助電子遊戲製作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言