joystick pack assets 추가
This commit is contained in:
9
Gameton-06/Assets/Joystick Pack/Scripts/Base.meta
Normal file
9
Gameton-06/Assets/Joystick Pack/Scripts/Base.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 04bf1fec540b6ee4987dc6524756477c
|
||||
folderAsset: yes
|
||||
timeCreated: 1513537865
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
150
Gameton-06/Assets/Joystick Pack/Scripts/Base/Joystick.cs
Normal file
150
Gameton-06/Assets/Joystick Pack/Scripts/Base/Joystick.cs
Normal file
@@ -0,0 +1,150 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
public class Joystick : MonoBehaviour, IPointerDownHandler, IDragHandler, IPointerUpHandler
|
||||
{
|
||||
public float Horizontal { get { return (snapX) ? SnapFloat(input.x, AxisOptions.Horizontal) : input.x; } }
|
||||
public float Vertical { get { return (snapY) ? SnapFloat(input.y, AxisOptions.Vertical) : input.y; } }
|
||||
public Vector2 Direction { get { return new Vector2(Horizontal, Vertical); } }
|
||||
|
||||
public float HandleRange
|
||||
{
|
||||
get { return handleRange; }
|
||||
set { handleRange = Mathf.Abs(value); }
|
||||
}
|
||||
|
||||
public float DeadZone
|
||||
{
|
||||
get { return deadZone; }
|
||||
set { deadZone = Mathf.Abs(value); }
|
||||
}
|
||||
|
||||
public AxisOptions AxisOptions { get { return AxisOptions; } set { axisOptions = value; } }
|
||||
public bool SnapX { get { return snapX; } set { snapX = value; } }
|
||||
public bool SnapY { get { return snapY; } set { snapY = value; } }
|
||||
|
||||
[SerializeField] private float handleRange = 1;
|
||||
[SerializeField] private float deadZone = 0;
|
||||
[SerializeField] private AxisOptions axisOptions = AxisOptions.Both;
|
||||
[SerializeField] private bool snapX = false;
|
||||
[SerializeField] private bool snapY = false;
|
||||
|
||||
[SerializeField] protected RectTransform background = null;
|
||||
[SerializeField] private RectTransform handle = null;
|
||||
private RectTransform baseRect = null;
|
||||
|
||||
private Canvas canvas;
|
||||
private Camera cam;
|
||||
|
||||
private Vector2 input = Vector2.zero;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public virtual void OnPointerDown(PointerEventData eventData)
|
||||
{
|
||||
OnDrag(eventData);
|
||||
}
|
||||
|
||||
public void OnDrag(PointerEventData eventData)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
protected virtual void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)
|
||||
{
|
||||
if (magnitude > deadZone)
|
||||
{
|
||||
if (magnitude > 1)
|
||||
input = normalised;
|
||||
}
|
||||
else
|
||||
input = Vector2.zero;
|
||||
}
|
||||
|
||||
private void FormatInput()
|
||||
{
|
||||
if (axisOptions == AxisOptions.Horizontal)
|
||||
input = new Vector2(input.x, 0f);
|
||||
else if (axisOptions == AxisOptions.Vertical)
|
||||
input = new Vector2(0f, input.y);
|
||||
}
|
||||
|
||||
private float SnapFloat(float value, AxisOptions snapAxis)
|
||||
{
|
||||
if (value == 0)
|
||||
return value;
|
||||
|
||||
if (axisOptions == AxisOptions.Both)
|
||||
{
|
||||
float angle = Vector2.Angle(input, Vector2.up);
|
||||
if (snapAxis == AxisOptions.Horizontal)
|
||||
{
|
||||
if (angle < 22.5f || angle > 157.5f)
|
||||
return 0;
|
||||
else
|
||||
return (value > 0) ? 1 : -1;
|
||||
}
|
||||
else if (snapAxis == AxisOptions.Vertical)
|
||||
{
|
||||
if (angle > 67.5f && angle < 112.5f)
|
||||
return 0;
|
||||
else
|
||||
return (value > 0) ? 1 : -1;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (value > 0)
|
||||
return 1;
|
||||
if (value < 0)
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public virtual void OnPointerUp(PointerEventData eventData)
|
||||
{
|
||||
input = Vector2.zero;
|
||||
handle.anchoredPosition = Vector2.zero;
|
||||
}
|
||||
|
||||
protected Vector2 ScreenPointToAnchoredPosition(Vector2 screenPosition)
|
||||
{
|
||||
Vector2 localPoint = Vector2.zero;
|
||||
if (RectTransformUtility.ScreenPointToLocalPointInRectangle(baseRect, screenPosition, cam, out localPoint))
|
||||
{
|
||||
Vector2 pivotOffset = baseRect.pivot * baseRect.sizeDelta;
|
||||
return localPoint - (background.anchorMax * baseRect.sizeDelta) + pivotOffset;
|
||||
}
|
||||
return Vector2.zero;
|
||||
}
|
||||
}
|
||||
|
||||
public enum AxisOptions { Both, Horizontal, Vertical }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b9fca4100a7477741b3973b4ff2c405f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
8
Gameton-06/Assets/Joystick Pack/Scripts/Editor.meta
Normal file
8
Gameton-06/Assets/Joystick Pack/Scripts/Editor.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8bf1b896f4e24d441975cb6f11f92e74
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,35 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
[CustomEditor(typeof(DynamicJoystick))]
|
||||
public class DynamicJoystickEditor : JoystickEditor
|
||||
{
|
||||
private SerializedProperty moveThreshold;
|
||||
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
moveThreshold = serializedObject.FindProperty("moveThreshold");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
base.OnInspectorGUI();
|
||||
|
||||
if (background != null)
|
||||
{
|
||||
RectTransform backgroundRect = (RectTransform)background.objectReferenceValue;
|
||||
backgroundRect.anchorMax = Vector2.zero;
|
||||
backgroundRect.anchorMin = Vector2.zero;
|
||||
backgroundRect.pivot = center;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void DrawValues()
|
||||
{
|
||||
base.DrawValues();
|
||||
EditorGUILayout.PropertyField(moveThreshold, new GUIContent("Move Threshold", "The distance away from the center input has to be before the joystick begins to move."));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 52071c88a467b46438b3cbf159bf988b
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,21 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
[CustomEditor(typeof(FloatingJoystick))]
|
||||
public class FloatingJoystickEditor : JoystickEditor
|
||||
{
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
base.OnInspectorGUI();
|
||||
|
||||
if (background != null)
|
||||
{
|
||||
RectTransform backgroundRect = (RectTransform)background.objectReferenceValue;
|
||||
backgroundRect.anchorMax = Vector2.zero;
|
||||
backgroundRect.anchorMin = Vector2.zero;
|
||||
backgroundRect.pivot = center;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 614d06243900d764f9c50b4da2c950a3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,64 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEditor;
|
||||
|
||||
[CustomEditor(typeof(Joystick), true)]
|
||||
public class JoystickEditor : Editor
|
||||
{
|
||||
private SerializedProperty handleRange;
|
||||
private SerializedProperty deadZone;
|
||||
private SerializedProperty axisOptions;
|
||||
private SerializedProperty snapX;
|
||||
private SerializedProperty snapY;
|
||||
protected SerializedProperty background;
|
||||
private SerializedProperty handle;
|
||||
|
||||
protected Vector2 center = new Vector2(0.5f, 0.5f);
|
||||
|
||||
protected virtual void OnEnable()
|
||||
{
|
||||
handleRange = serializedObject.FindProperty("handleRange");
|
||||
deadZone = serializedObject.FindProperty("deadZone");
|
||||
axisOptions = serializedObject.FindProperty("axisOptions");
|
||||
snapX = serializedObject.FindProperty("snapX");
|
||||
snapY = serializedObject.FindProperty("snapY");
|
||||
background = serializedObject.FindProperty("background");
|
||||
handle = serializedObject.FindProperty("handle");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
|
||||
DrawValues();
|
||||
EditorGUILayout.Space();
|
||||
DrawComponents();
|
||||
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
|
||||
if(handle != null)
|
||||
{
|
||||
RectTransform handleRect = (RectTransform)handle.objectReferenceValue;
|
||||
handleRect.anchorMax = center;
|
||||
handleRect.anchorMin = center;
|
||||
handleRect.pivot = center;
|
||||
handleRect.anchoredPosition = Vector2.zero;
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void DrawValues()
|
||||
{
|
||||
EditorGUILayout.PropertyField(handleRange, new GUIContent("Handle Range", "The distance the visual handle can move from the center of the joystick."));
|
||||
EditorGUILayout.PropertyField(deadZone, new GUIContent("Dead Zone", "The distance away from the center input has to be before registering."));
|
||||
EditorGUILayout.PropertyField(axisOptions, new GUIContent("Axis Options", "Which axes the joystick uses."));
|
||||
EditorGUILayout.PropertyField(snapX, new GUIContent("Snap X", "Snap the horizontal input to a whole value."));
|
||||
EditorGUILayout.PropertyField(snapY, new GUIContent("Snap Y", "Snap the vertical input to a whole value."));
|
||||
}
|
||||
|
||||
protected virtual void DrawComponents()
|
||||
{
|
||||
EditorGUILayout.ObjectField(background, new GUIContent("Background", "The background's RectTransform component."));
|
||||
EditorGUILayout.ObjectField(handle, new GUIContent("Handle", "The handle's RectTransform component."));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4b2b0d911a01a64ebfca9918e2b90b4
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,37 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
using UnityEditor;
|
||||
|
||||
[CustomEditor(typeof(VariableJoystick))]
|
||||
public class VariableJoystickEditor : JoystickEditor
|
||||
{
|
||||
private SerializedProperty moveThreshold;
|
||||
private SerializedProperty joystickType;
|
||||
|
||||
protected override void OnEnable()
|
||||
{
|
||||
base.OnEnable();
|
||||
moveThreshold = serializedObject.FindProperty("moveThreshold");
|
||||
joystickType = serializedObject.FindProperty("joystickType");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
base.OnInspectorGUI();
|
||||
|
||||
if (background != null)
|
||||
{
|
||||
RectTransform backgroundRect = (RectTransform)background.objectReferenceValue;
|
||||
backgroundRect.pivot = center;
|
||||
}
|
||||
}
|
||||
|
||||
protected override void DrawValues()
|
||||
{
|
||||
base.DrawValues();
|
||||
EditorGUILayout.PropertyField(moveThreshold, new GUIContent("Move Threshold", "The distance away from the center input has to be before the joystick begins to move."));
|
||||
EditorGUILayout.PropertyField(joystickType, new GUIContent("Joystick Type", "The type of joystick the variable joystick is current using."));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 58b5a2db95af76c4c9d4116a09ec3697
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
9
Gameton-06/Assets/Joystick Pack/Scripts/Joysticks.meta
Normal file
9
Gameton-06/Assets/Joystick Pack/Scripts/Joysticks.meta
Normal file
@@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 30f674d88470a814e8648e216b61b9ef
|
||||
folderAsset: yes
|
||||
timeCreated: 1513537874
|
||||
licenseType: Store
|
||||
DefaultImporter:
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,41 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
public class DynamicJoystick : Joystick
|
||||
{
|
||||
public float MoveThreshold { get { return moveThreshold; } set { moveThreshold = Mathf.Abs(value); } }
|
||||
|
||||
[SerializeField] private float moveThreshold = 1;
|
||||
|
||||
protected override void Start()
|
||||
{
|
||||
MoveThreshold = moveThreshold;
|
||||
base.Start();
|
||||
background.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public override void OnPointerDown(PointerEventData eventData)
|
||||
{
|
||||
background.anchoredPosition = ScreenPointToAnchoredPosition(eventData.position);
|
||||
background.gameObject.SetActive(true);
|
||||
base.OnPointerDown(eventData);
|
||||
}
|
||||
|
||||
public override void OnPointerUp(PointerEventData eventData)
|
||||
{
|
||||
background.gameObject.SetActive(false);
|
||||
base.OnPointerUp(eventData);
|
||||
}
|
||||
|
||||
protected override void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)
|
||||
{
|
||||
if (magnitude > moveThreshold)
|
||||
{
|
||||
Vector2 difference = normalised * (magnitude - moveThreshold) * radius;
|
||||
background.anchoredPosition += difference;
|
||||
}
|
||||
base.HandleInput(magnitude, normalised, radius, cam);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba0d0e7a039f526499c356a3c5cd6d3f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,8 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
public class FixedJoystick : Joystick
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 45977bbae16431c46a013576a1aea384
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,26 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
public class FloatingJoystick : Joystick
|
||||
{
|
||||
protected override void Start()
|
||||
{
|
||||
base.Start();
|
||||
background.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
public override void OnPointerDown(PointerEventData eventData)
|
||||
{
|
||||
background.anchoredPosition = ScreenPointToAnchoredPosition(eventData.position);
|
||||
background.gameObject.SetActive(true);
|
||||
base.OnPointerDown(eventData);
|
||||
}
|
||||
|
||||
public override void OnPointerUp(PointerEventData eventData)
|
||||
{
|
||||
background.gameObject.SetActive(false);
|
||||
base.OnPointerUp(eventData);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7a47f546fc70ec8428172694e78e4288
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,63 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
|
||||
public class VariableJoystick : Joystick
|
||||
{
|
||||
public float MoveThreshold { get { return moveThreshold; } set { moveThreshold = Mathf.Abs(value); } }
|
||||
|
||||
[SerializeField] private float moveThreshold = 1;
|
||||
[SerializeField] private JoystickType joystickType = JoystickType.Fixed;
|
||||
|
||||
private Vector2 fixedPosition = Vector2.zero;
|
||||
|
||||
public void SetMode(JoystickType joystickType)
|
||||
{
|
||||
this.joystickType = joystickType;
|
||||
if (joystickType == JoystickType.Fixed)
|
||||
{
|
||||
background.anchoredPosition = fixedPosition;
|
||||
background.gameObject.SetActive(true);
|
||||
}
|
||||
else
|
||||
background.gameObject.SetActive(false);
|
||||
}
|
||||
|
||||
protected override void Start()
|
||||
{
|
||||
base.Start();
|
||||
fixedPosition = background.anchoredPosition;
|
||||
SetMode(joystickType);
|
||||
}
|
||||
|
||||
public override void OnPointerDown(PointerEventData eventData)
|
||||
{
|
||||
if (joystickType != JoystickType.Fixed)
|
||||
{
|
||||
background.anchoredPosition = ScreenPointToAnchoredPosition(eventData.position);
|
||||
background.gameObject.SetActive(true);
|
||||
}
|
||||
base.OnPointerDown(eventData);
|
||||
}
|
||||
|
||||
public override void OnPointerUp(PointerEventData eventData)
|
||||
{
|
||||
if (joystickType != JoystickType.Fixed)
|
||||
background.gameObject.SetActive(false);
|
||||
|
||||
base.OnPointerUp(eventData);
|
||||
}
|
||||
|
||||
protected override void HandleInput(float magnitude, Vector2 normalised, Vector2 radius, Camera cam)
|
||||
{
|
||||
if (joystickType == JoystickType.Dynamic && magnitude > moveThreshold)
|
||||
{
|
||||
Vector2 difference = normalised * (magnitude - moveThreshold) * radius;
|
||||
background.anchoredPosition += difference;
|
||||
}
|
||||
base.HandleInput(magnitude, normalised, radius, cam);
|
||||
}
|
||||
}
|
||||
|
||||
public enum JoystickType { Fixed, Floating, Dynamic }
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 42844a4fccbd54746b90cade4ff70f73
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user