質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

1回答

2429閲覧

(Unity)StandardAssetsのジョイスティックがドラックを止めた際に画面外に出てしまう。

Chi-hal

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/08/12 16:29

###前提・実現したいこと
Unityにて、スマートフォンゲームを作成しております。

ジョイスティックをStandardAssetsのMobileSingleStickControlを使用した所
実行時にジョイスティクを移動させ、離すと、初期位置が(0.0,0.0,0.0)になっており
画面外に出てしまいます。

実行時にスティックをドラックし離しても、画面内(実行前に配置した位置)に
戻るようにしたい。

###発生している問題・エラーメッセージ

エラー警告等は出ていません。

###該当のソースコード

using System; using UnityEngine; using UnityEngine.EventSystems; namespace UnityStandardAssets.CrossPlatformInput { public class Joystick : MonoBehaviour, IPointerDownHandler, IPointerUpHandler, IDragHandler { public enum AxisOption { // Options for which axes to use Both, // Use both OnlyHorizontal, // Only horizontal OnlyVertical // Only vertical } public int MovementRange = 100; public AxisOption axesToUse = AxisOption.Both; // The options for the axes that the still will use public string horizontalAxisName = "Horizontal"; // The name given to the horizontal axis for the cross platform input public string verticalAxisName = "Vertical"; // The name given to the vertical axis for the cross platform input public Vector3 m_StartPos; bool m_UseX; // Toggle for using the x axis bool m_UseY; // Toggle for using the Y axis CrossPlatformInputManager.VirtualAxis m_HorizontalVirtualAxis; // Reference to the joystick in the cross platform input CrossPlatformInputManager.VirtualAxis m_VerticalVirtualAxis; // Reference to the joystick in the cross platform input void OnEnable() { CreateVirtualAxes(); } void Start() { m_StartPos = transform.position; } void UpdateVirtualAxes(Vector3 value) { var delta = m_StartPos - value; delta.y = -delta.y; delta /= MovementRange; if (m_UseX) { m_HorizontalVirtualAxis.Update(-delta.x); } if (m_UseY) { m_VerticalVirtualAxis.Update(delta.y); } } void CreateVirtualAxes() { // set axes to use m_UseX = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyHorizontal); m_UseY = (axesToUse == AxisOption.Both || axesToUse == AxisOption.OnlyVertical); // create new axes based on axes to use if (m_UseX) { m_HorizontalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(horizontalAxisName); CrossPlatformInputManager.RegisterVirtualAxis(m_HorizontalVirtualAxis); } if (m_UseY) { m_VerticalVirtualAxis = new CrossPlatformInputManager.VirtualAxis(verticalAxisName); CrossPlatformInputManager.RegisterVirtualAxis(m_VerticalVirtualAxis); } } public void OnDrag(PointerEventData data) { Vector3 newPos = Vector3.zero; if (m_UseX) { int delta = (int)(data.position.x - m_StartPos.x); delta = Mathf.Clamp(delta, - MovementRange, MovementRange); newPos.x = delta; } if (m_UseY) { int delta = (int)(data.position.y - m_StartPos.y); delta = Mathf.Clamp(delta, -MovementRange, MovementRange); newPos.y = delta; } transform.position = new Vector3(m_StartPos.x + newPos.x, m_StartPos.y + newPos.y, m_StartPos.z + newPos.z); UpdateVirtualAxes(transform.position); } public void OnPointerUp(PointerEventData data) { transform.position = m_StartPos; UpdateVirtualAxes(m_StartPos); } public void OnPointerDown(PointerEventData data) { } void OnDisable() { // remove the joysticks from the cross platform input if (m_UseX) { m_HorizontalVirtualAxis.Remove(); } if (m_UseY) { m_VerticalVirtualAxis.Remove(); } } } }

###試したこと
Joystick.csを確認した所、Start()内にてジョイスティックの位置を初期位置として
m_StartPos(ドラッグを止めた際に初期位置に戻る時に使う変数)にジョイスティックの
座標を代入していますが、Debug.Logにて確認した所、Start()が呼ばれる時点では
座標が(0.0,0.0,0.0)になっています。

問題はジョイスティックを画面内に移動させて(0.0以外の座標)から実行していますが
Start()を呼ばれている時点で、代入されている(0.0,0.0,0.0)という値がどこから来ているのか
どのようにして、正しい初期位置をStart()内にて代入するかです。

###補足情報(言語/FW/ツール等のバージョンなど)
Unity 5.3.5f1
使用言語 C#

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ジョイスティックの入力値は位置を示す値ではなく、移動距離や速度を示す値ではないでしょうか?
位置として扱いたい場合は初期位置を別に管理して、
毎フレーム初期位置を基準にジョイスティックの入力値を加算する形にすれば、
ジョイスティックをニュートラルにした時に「実行前に配置した位置」に戻ると思います。

投稿2016/08/14 08:18

buibui80

総合スコア1033

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問