2013-02-25 108 views
0

我在Unity3D中用C#制作游戏。我正在使用GUI.box为小怪显示一个健康栏,但如果有目标,我只想显示GUI.box。Unity3D:如果条件为真,如何显示GUI.box?

这是我目前的代码。

public GameObject target; 
public bool existsTarget; 

// Use this for initialization 
void Start() 
{ 

PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack"); 
target = pa.target; 

existsTarget = false; 
} 

// Update is called once per frame 
void Update() 
{ 

if(target != null) 
existsTarget = true; 
else 
existsTarget = false; 


} 

void OnGUI() 
{ 
if(existsTarget) 
     GUI.Box(new Rect(500, 10, healthBarLength, 20), curHealth + "/" + maxHealth); 
    else { 
     GUI.Box(new Rect(Screen.width, 10, healthBarLength, 20), curHealth + "/" + maxHealth); 
    } 

不幸的是,这并没有显示任何健康栏。任何想法为什么?

在大众需求之后在这里发布脚本。

public class Targetting : MonoBehaviour { 
public List<Transform> targets; 
public List<Transform> items; 
public GameObject TheSelectedTarget {get; set;} 
private Transform selectedTarget; 
private Transform selectedItem; 
private Transform myTransform; 

// Use this for initialization 
void Start() { 
    targets = new List<Transform>(); 
    items = new List<Transform>(); 

    selectedTarget = null; 
    selectedItem = null; 
    myTransform = transform; 
    TheSelectedTarget = null; 

    addAllEnemies(); 
    addAllItems(); 
} 

//adds all targets to a list 
private void addAllEnemies() { 

    GameObject[] go = GameObject.FindGameObjectsWithTag("Enemy"); 

    foreach(GameObject enemy in go){ 
     addTarget(enemy.transform); 
    } 

} 

//adds a target 
private void addTarget(Transform enemy) { 

    targets.Add(enemy); 
} 

//sorts target by distance 
private void sortTargets() { 

    targets.Sort(delegate(Transform t1, Transform t2) { 
     return Vector3.Distance(t1.position, myTransform.position).CompareTo(Vector3.Distance(t2.position, myTransform.position)); 
    }); 
} 

//targets an enemy 
private void targetEnemy() { 

    addAllEnemies(); 

    if(selectedTarget == null) { 
     sortTargets(); 
     selectedTarget = targets[0]; 
    } else { 
     int index = targets.IndexOf(selectedTarget); 

     if(index < targets.Count -1) { 
      index++; 

     } else { 
      index = 0; 

     } 
     deselectTarget(); 
     selectedTarget = targets[index]; 
} 
    selectTarget(); 
    targets.Clear(); 
    } 
//selects a specific target, and colors it red 
public void selectTarget() { 

    selectedTarget.renderer.material.color = Color.red; 

    PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack"); 
    pa.target = selectedTarget.gameObject; 

    TheSelectedTarget = pa.target; 
} 

//deselects the current selected target, and colors i grey 
private void deselectTarget() { 
    selectedTarget.renderer.material.color = Color.gray; 
    selectedTarget = null; 
} 

//adds all items to a list 
void addAllItems() { 

GameObject[] go = GameObject.FindGameObjectsWithTag("Book"); 

foreach(GameObject book in go){ 
    addItem(book.transform); 
} 

}

'

....然后脚本将继续,但没有任何相关性这个......

'   public class EnemyHealth : MonoBehaviour 
      { 
      public string enemyName; 
       public int maxHealth = 100; 
       public int curHealth = 100; 
       public float healthBarLength; 
       public GameObject target; 
      public bool existsTarget; 
      public AudioSource dying; 

    // Use this for initialization 
    void Start() 
{ 
    //enemyName = this.enemyName; 
    healthBarLength = Screen.width/3; 

    existsTarget = false; 
} 

// Update is called once per frame 
void Update() 
{ 
    adjustCurHealth(0); 

    Targetting ta = (Targetting)GetComponent("Targetting"); 
    target = ta.TheSelectedTarget; 
    Debug.Log (target); 

    if(target != null) 
     existsTarget = true; 
    else { 
     existsTarget = false; 
    } 

} 

void OnGUI() 
{ 
    if(existsTarget) 
     GUI.Box(new Rect(500, 10, healthBarLength, 20), curHealth + "/" + maxHealth); 
    else { 
     GUI.Box(new Rect(Screen.width, 10, healthBarLength, 20), curHealth + "/" + maxHealth); 
    } 
} 

public void adjustCurHealth(int adj) 
{ 
    curHealth += adj; 

    if (curHealth < 0) 
     curHealth = 0; 

    if (curHealth > 100) 
     curHealth = 100; 

    if (maxHealth < 0) 
     maxHealth = 1; 

    if(curHealth == 0) 
    { 
     //dying.Play(); 
     GameObject.Destroy(gameObject); 
    } 

    healthBarLength = (Screen.width/3) * (curHealth/(float)maxHealth); 
} 

}

+2

仔细检查你的盒子的位置参数。我猜你是在告诉它不在屏幕上,或者是长度。 – 2013-02-26 00:06:06

+1

我也在考虑位置参数是这里的问题,试着用一个更大的(200x50)在原点来看看会发生什么。顺便说一下,在OnGUI()中检查'target!= null'的情况不是更容易吗?请记住,这种方法可能每帧被调用一次以上。 – 2013-02-26 00:16:46

+0

感谢您的评论! 我不认为这是位置参数,因为GUI.box显示完全正常,如果我只是带走if条件。起初,我确定GUI.box显示正常,但随后我一直看到所有小怪的生命线,这当然不是很好 - 我的第一次尝试是在OnGUI()中有条件,但没有奏效,所以我认为它不会在每一帧更新,所以我将它移动到Update()。现在再试一次,但没有奏效。 – Lennev 2013-02-26 00:47:33

回答

1

你永远将目标设置为Start()方法以外的任何位置?如果PlayerAttack.Target在开始时不为空,则您显示的代码将只显示GUI.box。尝试将此代码移至Update()方法。

PlayerAttack pa = (PlayerAttack)GetComponent("PlayerAttack"); 
target = pa.target; 

编辑:看到

检查目标为空,这可能是问题。

target = pa.target; 
Debug.Log(target); 

这将打印到日志中,无论它是什么游戏对象,或null。如果它是空的,那么就没有目标。

+0

感谢您的提示,不幸的是它没有工作,但:/ – Lennev 2013-02-26 07:56:21

+0

是附加到您试图从中获得它从相同的组件的PlayerAttack脚本? – Heisenbug 2013-02-26 08:45:54

+0

不,它不是。只是附加它,但是这也不起作用:( – Lennev 2013-02-26 10:14:42

相关问题