前回のUnity基礎6でボタンオブジェクトを使って会話ログの表示を制御したように、ゲームでは、あるオブジェクトから別のオブジェクトを操作したい場面は多々発生します。例えば攻撃ボタンを押した際にプレイヤーに攻撃させるといった処理です。今回はそのような状況を想定し、下記「Unity基礎6」でも使用したSerializedFieldを使用して、特定のオブジェクトから別オブジェクトを操作する方法の一つを紹介します。

準備
今回は戦闘画面で攻撃ボタンを押した時にプレイヤーがエネミーにダメージを与える処理を想定します。とはいえエネミーやプレイヤーを用意するのは手間がかかりますので、簡単のため、下図のような形で「攻撃」ボタンを押した時に画面上のテキストにエネミーに与えたダメージの数値「10」を表示させるものとします。
オブジェクトから別オブジェクトを操作する方法
前提となる準備が整ったので、続いて特定のオブジェクトから別オブジェクトを操作する方法を説明していきます。
SREP1:主となるオブジェクトにアタッチするスクリプトの作成
先ずは別オブジェクトを操作する側のオブジェクト(今回の例ではボタンオブジェクト)にアタッチするスクリプトを作成します。今回は下図のようにAttackButtonControllerという名前でスクリプトを作成しました。
STEP2:操作対象となるオブジェクトをスクリプトに認識させる
主となるオブジェクト(今回の例ではボタンオブジェクト)から操作対象となるオブジェクト(今回の例ではテキスト)を制御させるには、主となるオブジェクトにアタッチさせるスクリプトに操作対象となるオブジェクトを認識させる必要があります。ざっくりいうと、どれが操作したいオブジェクトなのかがわからないと制御のしようがないので、「これが操作したいオブジェクトだよ」と教えてあげるということです。詳しい内容は後にして、実際のスクリプトを示すと下記となります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//Textを扱うために導入
public class AttackButtonController : MonoBehaviour
{
[SerializeField] Text DamageText = null;//ダメージを表示させるテキストとの連携のために導入
}
上記スクリプトに関しての説明は下記の通りです。
7行目:AttackButtonControllerクラスに、ダメージを表示させるテキストを認識させるための構文。「DamageText」と記述した部分は任意の名前でOK。
STEP3:スクリプトの主となるオブジェクトへのアタッチ
上記STEP2で記述したスクリプトではまだ処理としては未完成ですが、説明のため、先ずは作成したスクリプトをボタンオブジェクトにアタッチします。(下図参照)
STEP4:スクリプトに操作したいオブジェクトを認識させる
STEP3でボタンオブジェクトにスクリプトをアタッチすると下図のように、インスペクターウィンドウ上でDamageTextという箱ができます。そこにダメージ値を表示したいテキストオブジェクトをドラッグ&ドロップします。
STEP5:操作内容に応じてスクリプトを編集する
操作対象となるオブジェクトをスクリプトが認識できたので、続いて実際に操作したい内容をスクリプトに記述します。今回は下記のような内容となります。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//Textを扱うために導入
public class AttackButtonController : MonoBehaviour
{
[SerializeField] Text DamageText = null;//ダメージを表示させるテキストとの連携のために導入
//攻撃ボタンが押された時の動作。Textオブジェクトに10と表示させる
public void ClickAttackButton()
{
//Text型変数DamageTextのテキスト表示内容を10に変更する
DamageText.text = "10";
}
}
上記スクリプトに関しての説明は下記の通りです。ただし、4,7行目は前述と変わりありませんので、説明は省略しています。
12行目:Text型変数DamageTextのテキスト表示内容を10に変更する処理
STEP6:ボタンオブジェクトのクリック時動作の設定
このステップで行う内容は、対象となるオブジェクトにより変わります。今回の例ではボタンオブジェクトをクリックした時に操作がされるようにしたいため、ボタンクリック時の動作をボタンオブジェクトに認識させます。具体的には下図のように「攻撃」ボタンオブジェクトのOnClick()に先のClickAttackButtonメソッドを設定します。

機能テスト
ここまでできたらPlayボタンを押してゲームを起動させ、処理が想定どおりに行われているか確認しましょう。実際に起動させてみた結果、下図のようにダメージ値を表示させるテキストの表示内容が「0」の状態から「攻撃」ボタンをクリックしたところテキストの表示内容が「10」に変更されました。
今回はSerialiedFieldを使って、オブジェクトから別オブジェクトを操作する方法について説明しましたがいかがだったでしょうか。上記説明では単純なテキスト内容の変更でしたが、攻撃によるHPの減少などもほぼ同様の処理で対応可能ですし、複数のオブジェクトを同時に操作してダメージのアニメーション&ダメージ表示といったこともできます。これだけにとどまらず様々な場面で使用できる便利な方法ですので、皆様のゲームの製作でも役立つのではないかと思います。ぜひ参考にしていただければと思います。
以上。
コメント