0

我创建了一个基于 3D 对象(平面)的基本 HUD 雷达系统,脚本检测敌人并在屏幕上跟随他,但我的问题是,有时 HUD 会超出屏幕区域。

这是我的代码:

#pragma strict

// ******Public dimentions ******
public var AircraftObject : Transform;
// ******Private dimentions ******
//Fetch CpuScript class to get some varibles
private var mainClass : CpuScript;
private var isRenderer : boolean;
private var aircraftArea : float;
//Other perfabs
private var Spd : GameObject;
private var Alt : GameObject;
private var Trg : GameObject;
//Calculating varibles
private var Distance : int;
private var Speed : int;


function Awake()
{
    //Finding all objects
    findObjects();
    //Set PlayerScript into the mainClass
    mainClass = gameObject.GetComponent(CpuScript);
}

function FixedUpdate() 
{
    isRenderer = mainClass.isProximity;
    aircraftArea = mainClass.mainObjectArea;
    transform.position.x = aircraftArea / 6;
    //Set GUI's
    guiControl();
    getValue();
}

function guiControl()
{
    Spd.GetComponent.<TextMesh>().text = Speed + " Knot";
    Alt.GetComponent.<TextMesh>().text = "Enemy detected";
    Trg.GetComponent.<TextMesh>().text = Distance + " Ft";
}

function getValue()
{
    Distance = Vector3.Distance(AircraftObject.transform.position, mainClass.AircraftDistance) * 4;
    Speed = Random.Range(100, 300);
}

function findObjects()
{
    Spd = GameObject.Find("Speed");
    Alt = GameObject.Find("Alt");
    Trg = GameObject.Find("AimTarget");
}
4

1 回答 1

2

无法从代码中准确地说出您的 3d hud 为何会离开屏幕。

但是,如果您想始终将任何 3d 对象(例如您的 HUD)保留在屏幕上,则需要确保它始终由相机呈现在屏幕上。

这可以通过多种方式完成。

一种方法是:

  1. 使用第二个摄像头渲染 HUD
  2. 仅将其清除标志设置为深度(在检查器中)
  3. 将此相机的深度设置为高于主相机(在检查器中)

只要您不移动第二个摄像头,就应该始终显示 HUD。

您还需要确保主摄像机不会渲染 HUD。通过以下方式执行此操作:

  1. 更改 HUD 的图层(创建您赢得的 HUD 图层)。
  2. 将 hud 相机设置为仅渲染该图层。
  3. 设置主摄像机以渲染除 HUD 层之外的所有其他层。

您可以在两个相机的检查器中使用剔除蒙版放置选择器来执行此操作。

仅供参考:您也可以在代码中设置摄像机的剔除蒙版,但要做到这一点,您需要使用按位运算符。

替代方法包括使 HUD 成为场景视图中主摄像机的子项,以便在摄像机移动时 HUD 移动到该位置。但是,这可能会导致您的 HUD 被其他游戏对象遮挡。

于 2012-04-27T13:31:57.257 回答