- Home /
Name Hovering over Weapon Model. Problem!
Hey guys,
I have a problem with a script. I'm trying to implement that the name of a weapon hovers over it. Here is the script:
function OnGUI ()
{
for (var go : GameObject in FindObjectsOfType(GameObject)){
for (var i=0;i<transform.childCount;i++){
if(go.tag==WeaponsArray[i] && !go.transform.parent){
if(Vector3.Distance(transform.position, go.transform.position)<20){
GUI.Box(Rect(Camera.main.WorldToScreenPoint(go.transform.position).x,Screen.height-Camera.main.WorldToScreenPoint(go.transform.position).y,50,20), go.tag);
}
}
}
}
}
Btw: WeaponsArray is an array with all of the weapon names.
The script works in the way that the name does hover over the weapons. But the problem I have is that there are also names on the mirror side. I mean when I turn around there are names hovering on the positions where the weapons were when you would mirror them on the camera.
I searched for this problem and found something but it didn't worked so I hope someone of you can help me.
Answer by Berenger · Jun 03, 2012 at 08:15 PM
You really shouldn't use any Find function in OnGUI, as it is called several times per frame. About your problem, isn't there a confusion between 2d and 3d ?
Don't you expect the names to be on a 3D plane and be reversed when you turn around ? $$anonymous$$aybe I misunderstood the mirror thing.
The names are not on a plane they are GUI-boxes. I get the position they should have on the screen through Camera.WorldToScreenPoint. With this technique the gui-boxes are on the 2d-screen but are also over the weapons model. So the names are not in the 3d scene just on the 2d gui. The problem I have is that they also appear when I look in the exact opposite direction of the Weapon$$anonymous$$odel. I hope this clears things up and now someone can help me.
Ooooook, it's displayed even when the weapon is outside the camera's frustrum. It's strange that the 2D coordinate you find are whithin range, but anyway you can use go.renderer.isVisible before drawing the gui.
go.renderer.isVisible worked like a charm and I will change the find thing to something more cpu friendly^^. Big Thanks although it seems you didn't quite understand my entire script :).
Answer by vzdemon · Jun 04, 2012 at 11:56 AM
You have to do some kind of convertion from 3D coordinates to 2D point and that is mighty difficult. what you should do instead is put a 3D text object over each weapon and put this script over it to tell it to only appear if the player is a certain distance from it.
var player : Transform;
var minDist : float = 20;
function Update() {
if(Vector3.Distance(player.position,transform.position)<minDist){
GetComponent(TextMesh).active = true;
}else{
GetComponent(TextMesh).active = false;
}
}
I got it done with the script which is in the question and go.renderer.isVisible. For the convertion I used Camera.WorldToScreenPoint. This function gives back the screen position a 3d object has. ...but thanks for your answer I maybe use it at another point in my game.
Your answer
Follow this Question
Related Questions
GUI Window problem 2 Answers
GUI Button sound problem, don´t work 1 Answer
GUI display weapon name you are looking at 1 Answer
How to cut numbers after decimal point in coordinates? 1 Answer
Pause Menu background problem 0 Answers