すみません、どうにもうまくいかない部分があって、教えていただきたいことがあります。
コンフィグ制御でイベントトリガーのオンオフを、キャラが表示中であれば即時反映されるようにはなったのですが、
キャラが表示されていない、タイトル画面からコンフィグで設定を変えてゲームをスタートすると、
その設定が反映されないでイベントトリガーが機能してしまう状態になります。
キャラが表示されている状態からならコンフィグのオフに設定すれば反映されるものの、初回制御時がうまくいかないようです。
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using Utage;
public class AdvInputCaller : MonoBehaviour, IPointerClickHandler
{
AdvEngine engine;
AdvUguiManager uguiManager;
private bool? currentRaycasterState = null;
void Start()
{
engine = GameObject.FindFirstObjectByType<AdvEngine>();
if (engine != null)
{
uguiManager = engine.GetComponentInChildren<AdvUguiManager>();
}
if (uguiManager == null)
{
Debug.LogWarning("AdvUguiManager が見つかりませんでした。");
}
}
void OnEnable()
{
// 非表示から復活したとき、最後の設定を再適用
if (currentRaycasterState.HasValue)
{
ApplyRaycasterState(currentRaycasterState.Value);
}
}
public void OnPointerClick(PointerEventData eventData)
{
if (eventData.button != PointerEventData.InputButton.Left) return;
CallOnInput();
}
public void CallOnInput()
{
if (uguiManager != null)
{
uguiManager.OnInput();
}
}
public void ToggleRaycaster(bool isEnabled)
{
currentRaycasterState = isEnabled;
ApplyRaycasterState(isEnabled);
}
private void ApplyRaycasterState(bool isEnabled)
{
var canvases = GetComponentsInChildren<Canvas>(true);
foreach (var canvas in canvases)
{
var raycaster = canvas.GetComponent<GraphicRaycaster>();
if (raycaster != null)
{
raycaster.enabled = isEnabled;
Debug.Log($"[{gameObject.name}] GraphicRaycaster on '{
canvas.name}' is now {(isEnabled ? "ENABLED" : "DISABLED")}");
}
}
}
}
using UnityEngine;
using UnityEngine.UI;
using Utage;
using UtageExtensions;
using System.Collections.Generic;
using UnityEngine.EventSystems;
using System.Collections;
public class RaycasterConfigController : MonoBehaviour
{
[SerializeField] private List<GameObject> prefabList;
private List<GameObject> instantiatedObjects = new List<GameObject>();
public AdvEngine Engine => this.GetAdvEngineCacheFindIfMissing(ref engine);
[SerializeField] private AdvEngine engine;
public Toggle toggle;
public static RaycasterConfigController Instance { get; private set; }
void Awake()
{
// シングルトンパターンの設定
if (Instance == null)
{
Instance = this;
}
else
{
Destroy(gameObject); // 重複してたら消す
}
}
void Start()
{
StartCoroutine(InitAfterUtageReady());
}
IEnumerator InitAfterUtageReady()
{
yield return new WaitUntil(() => Engine.Param.IsInit);
Debug.Log("Param is ready");
// プレハブクローン化
foreach (var prefab in prefabList)
{
var instance = Instantiate(prefab, transform);
instantiatedObjects.Add(instance);
var raycasters = instance.GetComponentsInChildren<GraphicRaycaster>(true);
Debug.Log(raycasters.Length + " Raycasters found in " +
instance.name);
}
// Toggle設定(この時点でParamは初期化済み)
if (toggle != null)
{
int paramValue = GetRaycasterValue();
toggle.isOn = paramValue == 1;
toggle.onValueChanged.AddListener(OnToggleChanged);
ToggleRaycasters(paramValue == 1);
}
// Toggleが切り替わったら、パラメーターと状態を同期
toggle.onValueChanged.AddListener((value) =>
{
SetRaycasterValue(value ? 1 : 0);
ToggleRaycasters(value);
});
}
void OnEnable()
{
if (Engine.Param.IsInit)
{
toggle.isOn = GetRaycasterValue() == 1;
}
}
// UTAGE Paramから現在の設定を取得
public int GetRaycasterValue()
{
if (!Engine.Param.IsInit)
{
Debug.LogWarning("まだパラメーターが初期化されていません");
return 1;
}
return Engine.Param.GetParameterInt("Raycaster");
}
// UTAGE Paramに設定を書き込み
public void SetRaycasterValue(int value)
{
if (!Engine.Param.IsInit)
{
Debug.LogWarning("まだパラメーターが初期化されていません");
return;
}
Engine.Param.SetParameterInt("Raycaster", value);
Debug.Log("Raycaster Set To: " + value);
Debug.Log("Immediately Read: " + Engine.Param.GetParameterInt("Raycaster"));
}
// ON/OFF切り替え処理
// GraphicRaycasterのON/OFFを切り替えるトグル関数
public void ToggleRaycasters(bool isEnabled)
{
foreach (var inputCaller in engine.GraphicManager.GetComponentsInChildren<AdvInputCaller>(true))
{
inputCaller.ToggleRaycaster(isEnabled);
}
Debug.Log("Raycaster Param value = " + GetRaycasterValue());
}
// Toggle UI連動
// Toggleから呼び出す例
public void OnToggleChanged(bool value)
{
SetRaycasterValue(value ? 1 : 0); // ← パラメータに書き込む
ToggleRaycasters(value);
Debug.Log("Toggled! Set Param to: " + (value ? 1 : 0));
bool isEnabled = RaycasterConfigController.Instance.GetRaycasterValue() == 1;
ToggleRaycasters(isEnabled);
}
// リセットなどで初期値に戻す場合
public void OnClickConfigReset()
{
SetRaycasterValue(1);
toggle.isOn = true;
}
private HashSet<GameObject> processedCharacters = new HashSet<GameObject>();
void Update()
{
if (Input.GetKeyDown(KeyCode.R))
{
Debug.Log("Raycaster param is: " + Engine.Param.GetParameterInt("Raycaster"));
}
var inputCallers = engine.GraphicManager.GetComponentsInChildren<AdvInputCaller>(true);
foreach (var caller in inputCallers)
{
var obj = caller.gameObject;
if (!processedCharacters.Contains(obj))
{
// 新規キャラとして検知されたら、設定を適用
caller.ToggleRaycaster(GetRaycasterValue() == 1);
processedCharacters.Add(obj);
Debug.Log("Raycaster設定を新規キャラに適用: " +
obj.name);
}
}
}
}
Paramシートの方はType=Int Value=1
キャラが非表示状態でも次にキャラが表示される時にイベントトリガーがオフなら機能しないというようにできないでしょうか?
プレハブ構成は画像の通りです。
2025年4月17日木曜日 23:15:47 UTC+9 マッドネスラボ: