Skip to content

Instantly share code, notes, and snippets.

@bartwttewaall
Created July 22, 2019 07:22
Show Gist options
  • Save bartwttewaall/131502e6cb74ee6855805c658b3de862 to your computer and use it in GitHub Desktop.
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
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