iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
生成式 AI

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

D23 /技能資料實作2

  • 分享至 

  • xImage
  •  

在昨天的文章中我們已經把技能的運作邏輯的code寫出來了,但code裡是用Character的類型(class)來存取技能目標的數值,所以我們要先把GameManger宣告玩家跟敵人的方式換成Character,那這裡我們先讓ChatGPT給我一個修改的code。

統一角色宣告方式

我這裡是先詢問ChatGPT角色數值的類型是不是不同。

GameManger中設定角色數值,是不是跟skill存取的player資料不一樣

看起來你在GameManager裡設置的playerHealthplayerMana等數據是獨立的變數,它們控制了玩家和AI的生命值和法力值,並更新UI。而之前在Skill範例中,你是使用了一個Character類來存儲玩家的數據。

不同點:

  1. GameManager 中的數據
    • 你直接將玩家和AI的數據(playerHealthplayerMana)作為 float 變數定義在 GameManager 裡。
    • 這些數據通過 GameManager 內的方法來修改,例如:PlayerTakesDamagePlayerHeal 等。
  2. SkillCharacter
    • Skill 系統的範例中,你使用了一個 Character 類來封裝角色的狀態(如生命值和法力值)。
    • Character 類提供了 TakeDamage()Heal() 等方法來操控角色數據。

如何統一這兩個數據源

你可以將 GameManager 中的 playerHealthplayerMana 變數替換為 Character 類的實例,這樣可以讓 GameManagerSkill 系統使用相同的角色數據結構。

統一的方式:

  1. 使用 Character 類來統一數據:

先確保有一個 Character 類,來存儲玩家和AI的數據:

public class Character
{
    public string Name { get; private set; }
    public float Health { get; private set; }
    public float Mana { get; private set; }

    public Character(string name, float health, float mana)
    {
        Name = name;
        Health = health;
        Mana = mana;
    }

    public void TakeDamage(float damage)
    {
        Health -= damage;
        if (Health < 0) Health = 0;
    }

    public void Heal(float healAmount)
    {
        Health += healAmount;
        if (Health > 100) Health = 100;
    }

    public void UseMana(float manaCost)
    {
        Mana -= manaCost;
        if (Mana < 0) Mana = 0;
    }

    public void RestoreMana(float amount)
    {
        Mana += amount;
        if (Mana > 100) Mana = 100;
    }
}

  1. GameManager 中使用 Character 類:

GameManager 中的數據結構更新為使用 Character 類,這樣可以與 Skill 系統保持一致。

using UnityEngine;
using UnityEngine.UI;

public class GameManager : MonoBehaviour
{
    // 玩家和AI的角色實例
    public Character player;
    public Character ai;

    // 連接到UI元件的引用
    public Slider playerHealthSlider;
    public Slider playerManaSlider;
    public Slider aiHealthSlider;
    public Slider aiManaSlider;

    // 初始化玩家和AI的生命值與法力值
    void Start()
    {
        // 初始化玩家和AI角色
        player = new Character("Player", 100, 50);
        ai = new Character("AI", 100, 50);

        UpdateUI(); // 初始化UI
    }

    void Update()
    {
        UpdateUI(); // 實時更新UI
    }

    // 更新UI顯示玩家和AI的生命值、法力值
    void UpdateUI()
    {
        playerHealthSlider.value = player.Health / 100;
        playerManaSlider.value = player.Mana / 100;
        aiHealthSlider.value = ai.Health / 100;
        aiManaSlider.value = ai.Mana / 100;
    }

    // 玩家和AI受到傷害時調用這個函數
    public void PlayerTakesDamage(float damage)
    {
        player.TakeDamage(damage);
        UpdateUI();
    }

    public void AITakesDamage(float damage)
    {
        ai.TakeDamage(damage);
        UpdateUI();
    }

    // 使用法術時減少法力值
    public void PlayerUsesMana(float manaCost)
    {
        player.UseMana(manaCost);
        UpdateUI();
    }

    public void AIUsesMana(float manaCost)
    {
        ai.UseMana(manaCost);
        UpdateUI();
    }

    // 恢復玩家和AI的法力或生命值
    public void PlayerHeal(float healAmount)
    {
        player.Heal(healAmount);
        UpdateUI();
    }

    public void AIHeal(float healAmount)
    {
        ai.Heal(healAmount);
        UpdateUI();
    }
}

好處:

  • 統一數據結構Character 類負責管理角色的狀態,不再需要分開管理玩家和AI的數據。這樣你的 GameManagerSkill 系統可以共享相同的數據結構。
  • 擴展性:如果未來你需要為角色添加更多屬性或行為(例如裝備、屬性加成等),可以在 Character 類中進行擴展,而不需要更改大量的代碼。
  • Skill 系統的兼容性:由於 Skill 系統使用的是 Character 類,因此你在 GameManager 中使用 Character 也能更好地進行技能和角色數據的交互。

這樣,你可以在 GameManagerSkill 系統中統一角色數據結構,並輕鬆管理玩家和AI的狀態。

讓玩家使用技能

先前的Skill的code中,我們是用interface的方式寫技能的架構的,這裡我想每個角色統一有自己的code可以控制技能的邏輯。所以這裡我們要新增一個PlayerController的script,順便在裡面也把玩家的角色實例化。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using static Skill;

public class PlayerController : MonoBehaviour
{
    // 定義一個角色,這裡可以是玩家角色
    private Character player;

    // 定義技能
    private ISkill flameImpact;
    private ISkill healingLight;

    void Start()
    {
        // 初始化玩家
        player = new Character("Player", 100, 50);

        // 初始化技能,這裡引用之前的技能實現
        flameImpact = new FlameImpact();
        healingLight = new HealingLight();
    }

    void Update()
    {
    }
    public void PlayerUseHealingLight() 
    {
        healingLight.UseSkill(player);
    }

    public void PlayerUseFlameImpact() 
    {
        flameImpact.UseSkill(player);
    }
}


上一篇
Day22 /技能資料實作
下一篇
Day 24/Unity按鈕案例實作
系列文
生成式AI輔助電子遊戲製作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言