Unityでシンプルなスキルツリーを作成するPart2です。
はじめに
Part1は下記です。
今回やる事
Part1では「簡単なUIとボタンを押したらステータス上昇」を作成しました。
Part2では「ボタンを押すと次のスキルが解放」されるのを実装していきます。
作成開始
UIを作成
Part1で作成した「MaxHealthUP」を配下ごとコピーして、名前を「AttackDamageUP」に変更。位置とアイコンを変更して、繋ぐ線(line)も追加します。
繋ぐ線(line)は好きなものでOK、下記は白色の画像のサイズを変更して置いてあるだけです。

スクリプトの変更
「SkillPanel」スクリプトを下記に変更します。「nextSkillPanel」には開放するオブジェクトをセットします。UnityActionにパラメータを追加しています。
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
public class SkillPanel : MonoBehaviour
{
public static UnityAction<SkillPanel> OnSkillPanelClick;
public GameObject nextSkillPanel;
private Image skillImageBackColor;
private bool isLocked;
private void Start()
{
skillImageBackColor = GetComponent<Image>();
skillImageBackColor.color = Color.grey;
isLocked = false;
}
public void ButtonClick()
{
if(!isLocked)
{
isLocked = true;
skillImageBackColor.color = Color.white;
OnSkillPanelClick?.Invoke(this);
}
}
}
パラメータを追加したので「TestScript」を下記の様に変更。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public int maxHealth = 50;
private void OnEnable()
{
SkillPanel.OnSkillPanelClick += MaxHealthUP;
}
private void OnDisable()
{
SkillPanel.OnSkillPanelClick -= MaxHealthUP;
}
private void MaxHealthUP(SkillPanel skillPanel)
{
maxHealth += 10;
}
}
スキルツリーを管理
スキルツリーを管理するスクリプトを追加するので「SkillTreeCanvas」に「SkillTreeScript」スクリプトを新規追加。また、「AttackDamageUP」は初期では非アクティブにしておきます。

「SkillTreeScript」スクリプトの中身は下記に変更します。次のスキルパネルをアクティブにしています。
using UnityEngine;
public class SkillTreeScript : MonoBehaviour
{
private void OnEnable()
{
SkillPanel.OnSkillPanelClick += UnLockSkill;
}
private void OnDisable()
{
SkillPanel.OnSkillPanelClick -= UnLockSkill;
}
private void UnLockSkill(SkillPanel skillPanel)
{
if (skillPanel.nextSkillPanel != null)
{
skillPanel.nextSkillPanel.SetActive(true);
}
}
}
下記の様にパラメータをセットします。

実行して、下記の様に動けばOKです。

ボタンを押すと最大HPが上がるのみなので、「TestScript」を下記に変更。「StatusUP」の関数とデリゲート部分は「SkillTreeScript」に移動しても良さそう。
using UnityEngine;
public class TestScript : MonoBehaviour
{
public int maxHealth = 50;
public int attack = 10;
private void OnEnable()
{
SkillPanel.OnSkillPanelClick += StatusUP;
}
private void OnDisable()
{
SkillPanel.OnSkillPanelClick -= StatusUP;
}
private void StatusUP(SkillPanel skillPanel)
{
switch (skillPanel.name)
{
case "MaxHealthUP":
MaxHealthUP(10);
break;
case "AttackDamageUP":
AttackDamageUP(5);
break;
default:
Debug.Log("ErrorSkillName: " + skillPanel.name);
break;
}
}
private void MaxHealthUP(int amount)
{
maxHealth += amount;
}
private void AttackDamageUP(int amount)
{
attack += amount;
}
}
とりあえずスキルツリーの原型は完成。気が向いたらPart3でスキルポイントの管理などを追加するかも。
