在昨天的文章中我們已經把技能的運作邏輯的code寫出來了,但code裡是用Character
的類型(class)來存取技能目標的數值,所以我們要先把GameManger
宣告玩家跟敵人的方式換成Character
,那這裡我們先讓ChatGPT給我一個修改的code。
我這裡是先詢問ChatGPT角色數值的類型是不是不同。
GameManger中設定角色數值,是不是跟skill存取的player資料不一樣
看起來你在GameManager
裡設置的playerHealth
、playerMana
等數據是獨立的變數,它們控制了玩家和AI的生命值和法力值,並更新UI。而之前在Skill
範例中,你是使用了一個Character
類來存儲玩家的數據。
GameManager
中的數據:
playerHealth
和 playerMana
)作為 float
變數定義在 GameManager
裡。GameManager
內的方法來修改,例如:PlayerTakesDamage
、PlayerHeal
等。Skill
的 Character
類:
Skill
系統的範例中,你使用了一個 Character
類來封裝角色的狀態(如生命值和法力值)。Character
類提供了 TakeDamage()
和 Heal()
等方法來操控角色數據。你可以將 GameManager
中的 playerHealth
和 playerMana
變數替換為 Character
類的實例,這樣可以讓 GameManager
和 Skill
系統使用相同的角色數據結構。
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;
}
}
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的數據。這樣你的 GameManager
和 Skill
系統可以共享相同的數據結構。Character
類中進行擴展,而不需要更改大量的代碼。Skill
系統的兼容性:由於 Skill
系統使用的是 Character
類,因此你在 GameManager
中使用 Character
也能更好地進行技能和角色數據的交互。這樣,你可以在 GameManager
和 Skill
系統中統一角色數據結構,並輕鬆管理玩家和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);
}
}