【Unity基礎7】オブジェクトから別オブジェクトを操作する方法〜SerializedField〜

Unity基礎

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

【Unity基礎6】任意のタイミングで会話を表示させる方法〜Fungusの使い方③〜
今回はUnityで自身の設定した特定のタイミングで会話ログを表示させる方法について説明します。ゲームにおける戦闘終了時の経験値取得ログ表示を例として扱います。

準備

 

今回は戦闘画面で攻撃ボタンを押した時にプレイヤーがエネミーにダメージを与える処理を想定します。とはいえエネミーやプレイヤーを用意するのは手間がかかりますので、簡単のため、下図のような形で「攻撃」ボタンを押した時に画面上のテキストにエネミーに与えたダメージの数値「10」を表示させるものとします。

「攻撃」ボタンとText以外については前述の「Unity基礎6」で作成したプロジェクトをベースにしますので、必要に応じてそちらもご覧ください。

オブジェクトから別オブジェクトを操作する方法

 

前提となる準備が整ったので、続いて特定のオブジェクトから別オブジェクトを操作する方法を説明していきます。

SREP1:主となるオブジェクトにアタッチするスクリプトの作成

先ずは別オブジェクトを操作する側のオブジェクト(今回の例ではボタンオブジェクト)にアタッチするスクリプトを作成します。今回は下図のようにAttackButtonControllerという名前でスクリプトを作成しました。

STEP2:操作対象となるオブジェクトをスクリプトに認識させる

主となるオブジェクト(今回の例ではボタンオブジェクト)から操作対象となるオブジェクト(今回の例ではテキスト)を制御させるには、主となるオブジェクトにアタッチさせるスクリプトに操作対象となるオブジェクトを認識させる必要があります。ざっくりいうと、どれが操作したいオブジェクトなのかがわからないと制御のしようがないので、「これが操作したいオブジェクトだよ」と教えてあげるということです。詳しい内容は後にして、実際のスクリプトを示すと下記となります。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//Textを扱うために導入
public class AttackButtonController : MonoBehaviour
{
    [SerializeField] Text DamageText = null;//ダメージを表示させるテキストとの連携のために導入
}

上記スクリプトに関しての説明は下記の通りです。

4行目:Text型を使用するために導入が必要。(テキストオブジェクトを編集するために必要)
7行目:AttackButtonControllerクラスに、ダメージを表示させるテキストを認識させるための構文。「DamageText」と記述した部分は任意の名前でOK。

 

この状態ではまだ、DamageTextというものが何を指すのかはUnityは認識できていません。ですが、[SerializedFiled]を上記スクリプトのように記述することで、オブジェクトのドラッグ&ドロップを使って容易に変数DamageTextとダメージを表示させるテキストオブジェクトを連携させることがきます。

STEP3:スクリプトの主となるオブジェクトへのアタッチ

上記STEP2で記述したスクリプトではまだ処理としては未完成ですが、説明のため、先ずは作成したスクリプトをボタンオブジェクトにアタッチします。(下図参照)

STEP4:スクリプトに操作したいオブジェクトを認識させる

STEP3でボタンオブジェクトにスクリプトをアタッチすると下図のように、インスペクターウィンドウ上でDamageTextという箱ができます。そこにダメージ値を表示したいテキストオブジェクトをドラッグ&ドロップします。

この作業により、先ほどスクリプトで宣言した変数DamageTextとダメージ値を表示させるテキストオブジェクトが結びつきます。結果として変数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行目は前述と変わりありませんので、説明は省略しています。

9行目~13行目:攻撃ボタンが押された時に呼び出されるメソッド
12行目:Text型変数DamageTextのテキスト表示内容を10に変更する処理
実際にゲームを制作する場合、私はSTEP2と一緒にSTEP5を行うことが多いです。今回は説明をわかりやすくする目的であえてステップを分けましたが、実際のゲーム制作の際は皆さんもお好みに合わせてください。

STEP6:ボタンオブジェクトのクリック時動作の設定

このステップで行う内容は、対象となるオブジェクトにより変わります。今回の例ではボタンオブジェクトをクリックした時に操作がされるようにしたいため、ボタンクリック時の動作をボタンオブジェクトに認識させます。具体的には下図のように「攻撃」ボタンオブジェクトのOnClick()に先のClickAttackButtonメソッドを設定します。

ボタンクリック時の動作実装方法については下記@Unity基礎3」の「6.ボタンクリック時の機能実装」で詳しく説明していますので、必要に応じてご参照ください。

 

【Unity基礎3】画面遷移機能をボタンに実装する
今回はUnityでボタンが押された時に、別の画面を遷移(移動)する機能の実装について説明します。

 

機能テスト

 

ここまでできたらPlayボタンを押してゲームを起動させ、処理が想定どおりに行われているか確認しましょう。実際に起動させてみた結果、下図のようにダメージ値を表示させるテキストの表示内容が「0」の状態から「攻撃」ボタンをクリックしたところテキストの表示内容が「10」に変更されました。

①publicを用いた方法について:今回ご紹介した[SerializedField]の部分をpublicに置き換えても実は同じように別オブジェクトを操作することができます。ただし、良くも悪くも[SerializedField]を用いた場合は、別のクラスからDamageTextにアクセスすることはできません。状況に合わせて使用してみてください。
②GetComponentを用いた方法について:スクリプト上でGetComponentメソッドを使うことでも別オブジェクトの操作ができます。ただし、2つのオブジェクトの関係が親子関係にあるのか、あるいは別の関係にあるのか等、条件により複雑な処理が必要になったりする場合があります。状況やお好みに合わせて使用してみてください。

今回はSerialiedFieldを使って、オブジェクトから別オブジェクトを操作する方法について説明しましたがいかがだったでしょうか。上記説明では単純なテキスト内容の変更でしたが、攻撃によるHPの減少などもほぼ同様の処理で対応可能ですし、複数のオブジェクトを同時に操作してダメージのアニメーション&ダメージ表示といったこともできます。これだけにとどまらず様々な場面で使用できる便利な方法ですので、皆様のゲームの製作でも役立つのではないかと思います。ぜひ参考にしていただければと思います。

以上。

-ゲームアプリ「HelloAnotherWorld」ダウンロードのお願い-

私が作成したゲームアプリ「HellowAnotherWorld」をダウンロードしていただけると嬉しいです。
有料ではありますが、ペットボトル飲料一本分程度の値段ですので、是非お願いします。
皆様にもメリットがあり、「このサイトで勉強すればこの程度のアプリであれば自分一人で作成できるようになる」という一つの目安にもなるかと思います。

-ゲームアプリ「HelloAnotherWorld」ダウンロードのお願い-

私が作成したゲームアプリ「HellowAnotherWorld」をダウンロードしていただけると嬉しいです。
有料ではありますが、ペットボトル飲料一本分程度の値段ですので、是非お願いします。
皆様にもメリットがあり、「このサイトで勉強すればこの程度のアプリであれば自分一人で作成できるようになる」という一つの目安にもなるかと思います。

スポンサーリンク
HelloAnotherWorld
HelloAnotherWorld
¥120
posted withアプリーチ
Unity基礎
ソフィーのUnity講座

コメント