using UnityEngine;
using Utage;
using UtageExtensions;
//宴とゲーム処理を繋げてコントロールするためのサンプル
public class SampleController : MonoBehaviour
{
//ADVエンジン
public AdvEngine Engine
{
get { return this.GetComponentCacheFindIfMissing(ref engine); }
}
[SerializeField] protected AdvEngine engine;
//指定の名前のAdvGraphicObjectを探す
public AdvGraphicObject FindObject(string objectLabel)
{
return Engine.GraphicManager.transform.FindDeepAsComponent<AdvGraphicObject>(objectLabel,true);
}
//指定の名前のAdvGraphicObjectを探し、描画オブジェクト(プレハブならプレハブインスタンス)のコンポーネントを取得
public T FindAdvGraphicTargetComponent<T>(string objectLabel)
where T : class
{
AdvGraphicObject obj = FindObject(objectLabel);
if (obj == null)
{
//見つからない
return null;
}
//AdvGraphicObject以下に描画オブジェクトがない可能性があるので
//obj.TargetObjectで取得
var target = obj.TargetObject;
return target.GetComponentInChildren<T>();
}
//クリック処理のサンプル
public void SampleOnClick()
{
//ログを出力(不要なら消すこと)
Debug.Log($"SampleOnClick");
//指定の名前のキャラクター名のオブジェクト探し、
//そのコンポーネントを取得
string label = "うたこ";
var component = FindAdvGraphicTargetComponent<SamplePrefabComponent>(label);
if (component == null)
{
//見つからない
Debug.LogError($"{label} is not found");
return;
}
//ボタンクリック処理を呼び出す
component.OnClick();
}
//AdvEngine以下に一つしかSamplePrefabComponentを持つオブジェクトがないとわかっている場合に、
//そのコンポーネントを取得して呼び出す処理
void SampleSingleComponent()
{
var singleComponent = Engine.GetComponentInChildren<SamplePrefabComponent>();
singleComponent.OnClick();
}
//AdvEngine以下の全SamplePrefabComponentに処理をするなら
void SampleAllComponents()
{
foreach (var component in Engine.GetComponentsInChildren<SamplePrefabComponent>(true))
{
component.OnClick();
}
}
}
Unityの基本的なプログラムのやり方として、
プレハブから作成したオブジェクトなど、シーン内で参照を持っていない他のオブジェクトにあるコンポーネントを探してくる場合
特定の仕組みに関わりなく、汎用的に行うのであれば、
Find系のメソッドや、GetComponentInChildren系のメソッドを使用します。
指定のオブジェクト以下にある、指定の型のコンポーネントを取得するなら、GetComponentInChildrenを使います。
指定のオブジェクト以下にある、指定の型のコンポーネントをすべて取得するなら、GetComponentsInChildrenを使います。
名前で区別する場合、GetComponentsInChildrenで取得したのちに名前で一致するものを検索するだけです。
宴の場合でもそれは同じで、大抵はそれで事足りると思うのですが、
一応宴の仕組みに依存した書き方として、「GraphicManager以下にある指定の名前ラベルのオブジェクトの、プレハブインスタンスのコンポーネント」を取得する場合は、
上記のサンプルプログラムの「FindAdvGraphicTargetComponent」を使います。
呼び出すキャラクターラベルなどは任意にアレンジしてください。
また、SamplePrefabComponentは、適当につけているサンプル名なので、プレハブに追加した自作コンポーネント(質問の例ですと、CubismParameter など)の型に置き換えてください。