- Home /
GUI Element pointing toward object in world
Hi, I'm trying to pull off an interface arrow pointing toward an object in world space. The arrow is already on the location of the object and it also clamps to the edge of the screen, meaning it already indicates where the object is. My only problem is the rotation. I've tried using GUIUtility.RotateAroundPivot together with Vector2.Angle, but honestly I don't really know if it can be done this way or if I'm just miscalculating the whole thing.
This is what I'm currently doing, which results in behaviour I can't really explain.
float TempAngle = Vector2.Angle(targetPos, ActualPos);
GUIUtility.RotateAroundPivot(-TempAngle, targetPos);
With targetPos being the clamped WorldToScreenPoint of the object and ActualPos being the unclamped version. Anyone ever tried something like this before? I coudn't find it anywhere.
That said, I don't even understand what GUIUtility.RotateAroundPivot does at all.
Answer by robertbu · Mar 03, 2014 at 06:07 PM
It is a bit of example code that might help you. It assumes the right side of your texture is what is pointing. It rotates the specified texture (tex) around its middle. 'pivot' is in screen coordinates and is the position to place the texture. 'target' is the game object to follow. Initialize it through drag and drop or add code to Start to find the object:
#pragma strict
var tex : Texture2D; // Texture to be rotated
var target : Transform; // GameObject to point to
var pivot : Vector2; // Where to place the center of the texture
private var rect : Rect;
function Start() {
rect = new Rect(pivot.x - tex.width * 0.5f, pivot.y - tex.height * 0.5f, tex.width, tex.height);
}
function OnGUI() {
if (Event.current.type == EventType.Repaint) {
var dir = Camera.main.WorldToScreenPoint(target.position);
dir.y = Screen.height - dir.y;
dir = dir - pivot;
var angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg;
var matrixBackup = GUI.matrix;
GUIUtility.RotateAroundPivot(angle, pivot);
GUI.DrawTexture(rect, tex);
GUI.matrix = matrixBackup;
}
}
A C# translation:
using UnityEngine;
using System.Collections;
public class GUIPointer : $$anonymous$$onoBehaviour {
public Texture2D tex; // Texture to be rotated
public Transform target; // GameObject to point to
public Vector2 pivot; // Where to place the center of the texture
private Rect rect;
void Start() {
rect = new Rect(pivot.x - tex.width * 0.5f, pivot.y - tex.height * 0.5f, tex.width, tex.height);
}
void OnGUI() {
if (Event.current.type == EventType.Repaint) {
Vector2 dir = Camera.main.WorldToScreenPoint(target.position);
dir.y = Screen.height - dir.y;
dir = dir - pivot;
float angle = $$anonymous$$athf.Atan2(dir.y, dir.x) * $$anonymous$$athf.Rad2Deg;
var matrixBackup = GUI.matrix;
GUIUtility.RotateAroundPivot(angle, pivot);
GUI.DrawTexture(rect, tex);
GUI.matrix = matrixBackup;
}
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613135253im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Look at around one axis in local space 1 Answer
Rigidbody constraints in local space? 7 Answers
Look At with SmoothDamp 1 Answer