カテゴリー
Unity

【Unity】Dynamic(Floating) Joystick の 挙動について

スマホ向けアプリで利用される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にして再取得しているのか?です。何か意味があるのかもしれないので、そんな時はコメントアウトを外せば大丈夫。だと思います。


ブログランキング・にほんブログ村へ 記事が良ければ押してください。


『恐竜博物館』(Google Play)
初めてゲーム(Android)を作成しました。放置ゲームなので時間の空いた時にポチポチできます。是非やってみてください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です