スマホ向けアプリで利用されるVirtual Joystickで有名なフリーアセット「JOYSTICK PACK」がとても使い易くて申し分ないのですが、どうしても気になった事があったので書きます。
気になった事
Dynamic Joystick もしくは Floating Joystickを選択した時、ゲーム開始時の最初のタッチでいきなり動いてしまう+条件によってはJoystickの画面が表示されない。(一度、指を離して再度画面を押すと思い通りに動く)
上記症状は以下の条件で発生しました。
- Canvas のRender Modeが「Screen Space – Camera」(Overlayだと問題なし)
- Dynamic Joystick(Floating Joystick)のAxis OptionsがBoth以外だと(一番最初のタッチで)Joystickの画像が表示されない
原因は一番最初に画面をタッチした時にCameraの設定が正しくされていないためだったので、以下のように修正しました。
// Assets -> Joystick Pack -> Scripts -> Base -> Joystick.cs
protected virtual void Start()
{
HandleRange = handleRange;
DeadZone = deadZone;
baseRect = GetComponent<RectTransform>();
canvas = GetComponentInParent<Canvas>();
if (canvas == null)
Debug.LogError("The Joystick is not placed inside a canvas");
Vector2 center = new Vector2(0.5f, 0.5f);
background.pivot = center;
handle.anchorMin = center;
handle.anchorMax = center;
handle.pivot = center;
handle.anchoredPosition = Vector2.zero;
// 追加部分
cam = null;
if (canvas.renderMode == RenderMode.ScreenSpaceCamera)
cam = canvas.worldCamera;
}
public void OnDrag(PointerEventData eventData)
{
/* この部分をStart()に移動
cam = null;
if (canvas.renderMode == RenderMode.ScreenSpaceCamera)
cam = canvas.worldCamera;
*/
Vector2 position = RectTransformUtility.WorldToScreenPoint(cam, background.position);
Vector2 radius = background.sizeDelta / 2;
input = (eventData.position - position) / (radius * canvas.scaleFactor);
FormatInput();
HandleInput(input.magnitude, input.normalized, radius, cam);
handle.anchoredPosition = input * radius * handleRange;
}
これで一応ちゃんと動いています。
気になるのは、オリジナルではなぜ毎回Cameraをnullにして再取得しているのか?です。何か意味があるのかもしれないので、そんな時はコメントアウトを外せば大丈夫。だと思います。
コメントを残す