Created
July 22, 2019 07:22
-
-
Save bartwttewaall/131502e6cb74ee6855805c658b3de862 to your computer and use it in GitHub Desktop.
A clickable minimap that places a pointer sprite at the position where you clicked and returns a Vector2 with a range of -1 to 1 in both dimensions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using UnityEngine; | |
using UnityEngine.EventSystems; | |
using UnityEngine.UI; | |
using Wirelab.Pages; | |
public class MinimapComponent : BaseComponent, IPointerClickHandler { | |
public GameObject pointerPrefab; | |
public DataEvent<Vector2> onClick; | |
RectTransform rectTransform; | |
Image mapImage; | |
RectTransform pointer; | |
Vector2 pointerOffset; | |
Vector3 localPoint; | |
Vector2 localNormal; | |
void Awake () { | |
rectTransform = (rectTransform != null) ? rectTransform : gameObject.GetComponent<RectTransform> (); | |
mapImage = mapImage ?? gameObject.GetComponent<Image> (); | |
Debug.Assert (pointerPrefab != null, "Missing pointerPrefab"); | |
} | |
public void OnPointerClick (PointerEventData eventData) { | |
if (pointer == null) { | |
var go = GameObject.Instantiate (pointerPrefab, Vector3.zero, Quaternion.identity, transform); | |
pointer = go.GetComponent<RectTransform> (); | |
var image = go.GetComponentInChildren<Image> (); | |
var sprite = image.sprite; | |
if (sprite != null) { | |
// use sprite pivot offset for placement | |
var px = sprite.rect.width / 2 - sprite.pivot.x; | |
var py = sprite.rect.height / 2 - sprite.pivot.y; | |
if (image != null) pointerOffset = new Vector2 (px / 2, py / 2); | |
} | |
} | |
pointer.gameObject.SetActive (true); | |
localPoint = transform.InverseTransformPoint (eventData.pressPosition); | |
PlacePointer (localPoint); | |
localNormal.Set ((localPoint.x / rectTransform.rect.width + 0.5f) * 2 - 1, (localPoint.y / rectTransform.rect.height + 0.5f) * 2 - 1); | |
DispatchDataEvent<Vector2> (onClick, localNormal); | |
} | |
public void Clear () { | |
if (pointer != null) pointer.gameObject.SetActive (false); | |
} | |
// ---- private methods ---- | |
void PlacePointer (Vector2 position) { | |
pointer.localPosition = position + pointerOffset; | |
pointer.localScale = Vector3.one; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment