前提
Unity上でSliderを利用して動くロボットアームを作成しています.
エラーメッセージは出ていないのですが,Sliderが動かず困っています.
実現したいこと
・Sliderを動かすことによって関節角度を変えてロボットアームを動かす.
発生している問題・エラーメッセージ
特になし
該当のソースコード
C#
1ソースコード 2```using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using UnityEngine.UI; 6 7namespace InverseKinematics 8{ 9 10 11 public class JointController : MonoBehaviour 12 { 13 //robot 14 private GameObject[] joint = new GameObject[2]; 15 private GameObject[] arm = new GameObject[2]; 16 private float[] armL = new float[2]; 17 private Vector3[] angle = new Vector3[2]; 18 19 //UI 20 private GameObject[] slider = new GameObject[2]; 21 private float[] sliderVal = new float[2]; 22 private GameObject[] angText = new GameObject[2]; 23 private GameObject[] posText = new GameObject[2]; 24 25 // Start is called before the first frame update 26 void Start() 27 { 28 //robot 29 for (int i = 0; i < joint.Length; i++) 30 { 31 joint[i] = GameObject.Find("Joint_" + i.ToString()); 32 arm[i] = GameObject.Find("Arm_" + i.ToString()); 33 armL[i] = arm[i].transform.localScale.x; 34 } 35 36 37 for (int i = 0; i < joint.Length; i++) 38 { 39 slider[i] = GameObject.Find("Slider_" + i.ToString()); 40 angText[i] = GameObject.Find("Angle_" + i.ToString()); 41 sliderVal[i] = slider[i].GetComponent<Slider>().value; 42 } 43 posText[0] = GameObject.Find("Pos_X"); 44 posText[1] = GameObject.Find("Pos_Y"); 45 46 } 47 48 // Update is called once per frame 49 void Update() 50 { 51 for (int i = 0; i < joint.Length; i++) 52 { 53 sliderVal[i] = slider[i].GetComponent<Slider>().value; 54 angText[i].GetComponent<Text>().text = sliderVal[i].ToString("f2"); 55 angle[i].z = sliderVal[i]; 56 joint[i].transform.localEulerAngles = angle[i]; 57 58 } 59 float px = armL[0] * Mathf.Cos(angle[0].z * Mathf.Deg2Rad) + armL[1] * Mathf.Cos((angle[0].z + angle[1].z) * Mathf.Deg2Rad); 60 float py = armL[0] * Mathf.Sin(angle[0].z * Mathf.Deg2Rad) + armL[1] * Mathf.Sin((angle[0].z + angle[1].z) * Mathf.Deg2Rad); 61 62 posText[0].GetComponent<Text>().text = px.ToString("f2"); 63 posText[1].GetComponent<Text>().text = py.ToString("f2"); 64 } 65 } 66 67} 68 69 70### 試したこと 71いろいろ自分で調べてはみたのですがどこが悪さをしているのかがわかりません. 72 73### 補足情報(FW/ツールのバージョンなど) 74Unity2019.4.40f
提示されているスクリプトを見る限りではスライダーが操作できなくなる要因はないように思います。
SliderコンポーネントのInteracrableのチェックが外れている、handle rectのアタッチが外れているなどの可能性があるか、もしくは他のスクリプトでsliderの値をUpdateで書き換え続けているなどの可能性が考えられます。
対象のsliderは他のスクリプトから参照されていたりしますか?
Y0241-N様 回答ありがとうございます.
確認したところInteracrableのチェックはされており,handle rectにもHandleが入っている状態でした.また,使用しているスクリプトはこれのみなので,問題があるのはこのスクリプトなのではないかと考えます.
実行するとロボットアームが初期位置に固定され,sliderを使って動かそうとしても何も動かない状態です.
> スクリプトをデタッチ状態で実行したところsliderは動きませんでした。
ということはやはりこのスクリプトは関係はないという事なので、次に確認すべきことは
1,Hierarchy上にEventSystemが存在しているか。
UIが操作できない時の大半の理由は何らかの理由でEventSystemが消えており、操作できなくなっているケースです。恐らくこれではないかと。
2,Sliderの手前に別のUI(透過状態のPanelなど)があり、Sliderにアクセスできていない。
これを確認するにはRaycastヒットでクリック位置にあるオブジェクトを調べるか、SliderのOnValueChangedに適当なDebug.Logを仕込んで動かそうとしたときに反応があるかなどの方法で確認できます。
このどちらかで無いとなると、すみませんがこれ以上は特定できそうにないです。
Y0241-N様 回答ありがとうございます.
確認した結果,2の別のUIが存在しておりSliderにアクセスができていない状態でした.
一人で悩んでいたので解決できてようやく次に進めます.
本当にありがとうございました.
解決されたようで何よりです、今回のようにUI廻りは特に考えられる可能性が多いので大変ですよね。
経緯のまとめを回答として投稿させていただきますので、よければそちらをベストアンサーとして選択し、本質問をクローズしていただければと思います。
とても親切で丁寧な回答のおかげで解決することができました.
Y0241-N様の回答をベストアンサーとして選択し,クローズしようと思います.
今回は本当にありがとうございました.
回答1件
あなたの回答
tips
プレビュー