どうもUnity初心者です。初投稿なので、お手柔らかにお願いします。
前提1
以下の条件を全て含む。
・アクションゲーム
・AttackやJumpなどをマウスクリック(Button含め)で行うゲーム。
・スクリプト上は問題ない場合。
前提2
※
①ゲーム全体のCanvas( Screen Space - Overlay かScreen Space - Camera)
➁PlayerのHPバー専用のCanvas( World Space)
③HPバー(Sllider)
経緯と不具合
・2Dゲームで、PlayerとEnemyのHPバーを制作中に、以下の不具合が発生。
・Slider(HPバーとして使用)のValueが左右入力で勝手に動いていしまう。しかも、Plaeyrだけでなく、Enemyも。
解決
・インスペクター上でSliderコンポーネントのInteractableのチェックを外し、falseに。
説明(GPTに聞いた)
【Interactableとは】
・Button・Slider・Toggleなどの各UIパーツごとにあり、そのUIがタッチで反応するかを制御する。
【なぜ interactable = true だと Slider.value が勝手に動くのか】
・前提として、Slider は選択状態だとキーボード入力 or ゲームパッド入力で操作できる。
・interactable = true の場合、Sliderを一度クリックすると、クリックに反応しUIイベントシステムがSliderを選択状態にしてしまう。選択状態になったSliderは、キーボードの左右入力を受け入れ、それに応じて値を変化させてしまうから。
※Sliderをクリックしていない場合でもなる?
・スクリプトの処理やEventSystemの仕様で、クリックしていないアクティブなUI要素が選択状態になってしまう場合があるらしい。(ちなみに私はこのパターン)
【不具合の流れ】
・ゲーム中、Attackなどの動作で画面をクリック or 意図せずスライダーの部分をクリック→Sliderが選択状態になり、左右のInput入力を受けいれる → 左右のInput入力でSlider.Valueが動く。
余談: CanvasのGraphic Raycasterについて
【Graphic Raycasterとは】
・Canvas に付いているコンポーネントで、「ユーザーのクリックやタップをUIに届かせるかどうか」を制御する。
・ Interactableは各UIパーツについている。
つまり、CanvasのGraphic Raycasterをインスペクター上でflaseにすれば、UIはクリックに反応しない。 SliderのInteractableよりCanvasのGraphic Raycasterをfalseにした方がいい?
では、上記の前提2を例で考えてみる
▶①のCanvasのGraphic Raycasterをfalseにする場合
・これをfalseにすると、ゲーム全体のUIのクリック検出ができないので、私の場合、Buttonがあるから無理。
▶➁のCanvasのGraphic Raycasterをfalseにする場合
・これをfalseにしても、①のCanvasが全体を覆っているのでクリック検出はできる
以上から、今回の例の場合、Graphic Raycasterでは対応できないためSliderのInteractableをfalseにするのが正解。