SelectionClick時のオブジェクトにマウスを重ねるとき、そのオブジェクト名をポップアップで表示させたい

77 views
Skip to first unread message

shiro

unread,
Jun 29, 2025, 1:35:46 AM6/29/25
to 宴ユーザーグループ

お世話になっております。
現在、Utageを使って推理ゲームの制作を進めておりますが、以下の要件を実現する方法が分からず、ご教示いただきたくご連絡いたしました。


■ 開発環境

  • Utage:4.1.9

  • Unity:6.0.0 f1(Windows)

  • プログラム習熟度:初心者

■ ご相談内容
「SelectionClick」で表示されるオブジェクトについて、以下の処理を実現したいと考えています。

  1. オブジェクトにマウスを乗せた際、オブジェクト名をポップアップ表示する

  2. マウスオーバー中はオブジェクトを薄く色付けする

  3. マウスを離す、またはクリックしたらポップアップを非表示にし、色を元に戻す

Event Trigger などで試してみたものの、うまく動作せず設定方法がわかりませんでした。
つきましては、上記の要件を実現するための具体的な手順やサンプルコード、あるいは設定例などをご教示いただけますと幸いです。

お忙しいところ恐縮ですが、ご対応のほど何卒よろしくお願い申し上げます。

オブジェクト選択.png

マッドネスラボ

unread,
Jun 29, 2025, 4:22:27 AM6/29/25
to 宴ユーザーグループ

  • 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>();
        }
    }
}


オブジェクトからキャラクター名などの名前を取得するのは、下記のようになります。
キャラクターラベルやスプライトラベルのような、ラベル名であれば次のようにして取得できます。
            var objectName = advObject.gameObject.name;

キャラクターの表示名(キャラクターシートの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:
FixTextData.unitypackage
Reply all
Reply to author
Forward
0 new messages