- SelectionClick時のオブジェクトとマウスを連動するには
Unityの IPointerEnterHandlerや IPointerExitHandlerインターフェースを使うというのがポイントになり、それを使ったカスタムプログラムを書くことになります。
(既存のサンプルとしては、Utage/Sample/Scripts/SampleSelectionClickMouseCursor.cs にマウスが重なった時や離れたときにマウスカーソルを変更するサンプルがあります)
AdvEffectColorというのがあるのでそれを取得して行うと楽かと思います。
これらをふまえての、サンプルは下記のようになります。
using UnityEngine;
using UnityEngine.EventSystems;
using UtageExtensions;
namespace Utage
{
//選択肢クリックコマンド時のマウスが重なっときなどに色を変化するサンプル
public class Sample : MonoBehaviour
, IPointerEnterHandler
, IPointerExitHandler
, IAdvClickEventCustom
{
public AdvGraphicBase AdvGraphic => this.GetComponentCacheInParent(ref advGraphic);
AdvGraphicBase advGraphic;
public AdvGraphicObject AdvGraphicObject => AdvGraphic.ParentObject;
AdvEffectColor EffectColor => AdvGraphicObject.GetComponent<AdvEffectColor>();
//オブジェクト名をポップアップするコンポーネント(AdvEngine以下のGameObjectにある前提)
SampleObjectNameManager ObjectNameManager
{
get
{
if (objectNameManager==null)
{
var engine = AdvGraphic.Engine;
objectNameManager = engine.GetComponentInChildren<SampleObjectNameManager>(true);
}
return objectNameManager;
}
}
SampleObjectNameManager objectNameManager;
//マウスが重なった時
public void OnPointerEnter(PointerEventData eventData)
{
//色を変える
SetColor(Color.magenta);
//オブジェクト名をポップアップする
ObjectNameManager.EnterObject(this);
}
//マウスが離れた時
public void OnPointerExit(PointerEventData eventData)
{
//色を戻す
SetColor(Color.white);
//オブジェクト名のポップアップを終了する
ObjectNameManager.ExitObject(this);
}
//クリックイベントが追加された時(SelectionClickコマンドが有効になったとき)に呼ばれる
public void OnAddClickEvent()
{
//何か処理があれば行う
}
//クリックイベントが終わった時(SelectionClickコマンドが無効になったとき)に呼ばれる
public void OnRemoveClickEvent()
{
//色を戻す
SetColor(Color.white);
}
//色を設定
void SetColor(Color color)
{
EffectColor.ScriptColor = color;
}
}
}
表示するオブジェクトがSelectionClickコマンドに対応しているプレハブであれば、上記のコンポーネントをAddComponentするだけでいいです。
プレハブを使っていない通常の表示の場合は、「オブジェクト作成時に上記のコンポーネントを自動で追加する」という処理が追加で必要になりますので、
下記のようなコンポーネントをAdvEngine以下のGameObjectにAddComponentしてください。
(必要であれば、特定の名前のオブジェクトだけAddComponentするなどアレンジしてください)
using System.Collections.Generic;
using UnityEngine;
using UtageExtensions;
namespace Utage
{
public class SampleAddComponent : MonoBehaviour
{
private AdvEngine Engine => this.GetAdvEngineCacheFindIfMissing(ref engine);
public AdvEngine engine = null;
public List<string> targetNames;
void Awake()
{
engine.GraphicManager.OnInitGraphicObject.AddListener(OnInit);
}
//グラフィックオブジェクトの初期化時に呼ばれるイベント
void OnInit(AdvGraphicObject obj)
{
// Debug.Log("OnInit: " +
obj.gameObject.name);
obj.TargetObject.gameObject.AddComponent<Sample>();
}
}
}
オブジェクトからキャラクター名などの名前を取得するのは、下記のようになります。
キャラクターラベルやスプライトラベルのような、ラベル名であれば次のようにして取得できます。
キャラクターの表示名(キャラクターシートのNameText)を取得する場合、NameText がパラメータータグを使って変化する場合があったり、ローカライズされる場合があったりでするので、
さらに処理が必要になります。
(下記のサンプルプログラムを動かすには、宴の内部処理を公開処理に変更する必要があるので、添付のパッケージファイルの適用が必要です)
using UnityEngine;
using UtageExtensions;
namespace Utage
{
public class SampleObjectNameManager : MonoBehaviour
{
private AdvEngine Engine => this.GetAdvEngineCacheFindIfMissing(ref engine);
public AdvEngine engine = null;
public void EnterObject(SampleSelectionClickColor obj)
{
var advObject = obj.AdvGraphicObject;
//オブジェクト名(キャラクターラベル)
var objectName =
advObject.gameObject.name;
//表示名を取得するには、キャラクターシートの情報が必要
var graphicInfo = advObject.LastResource;
if(graphicInfo !=null && graphicInfo.SettingData is AdvCharacterSettingData settingData)
{
//キャラクターの名前テキストを取得
objectName = TextData.MakeCustomLogText(settingData.NameText);
//ローカライズする
var localizedName = LanguageManagerBase.Instance.LocalizeText( objectName);
Debug.Log("EnterObjectName: " + localizedName);
}
else
{
Debug.Log("EnterObjectLabel: " + objectName);
}
}
public void ExitObject(SampleSelectionClickColor obj)
{
var objectName =
obj.AdvGraphicObject.gameObject.name;
Debug.Log("ExitObject: " + objectName);
}
}
}
実際にポップアップしてテキスト表示したりするのは、Unity上に作成したUIに上記の名前テキストを設定するなどして、独自に実装してください。
2025年6月29日日曜日 14:35:46 UTC+9 shiro: