2014-07-17 2 views
1

저는 헬리 바 시스템에서 일하고 있습니다. 히스 바는 그들이 어디를 가든지 [완벽하게 작동하는] 적을 따라갑니다.적의 체력을 적보다 높게 표시합니다.

하지만 헬스 바에 건강 상태를 표시하고 싶습니다. 나는 일을 할 수 없습니다. 오류는 없지만 화면에는 나타나지 않습니다.

//This script works great. 
public Texture2D healthBar; 
public Texture2D healthBarFrame; 

public float maxHealth; 
public float curHealth; 

private int healthBarWidth = 50; 
private int healthBarHeight = 5; 

private float left; 
private float top; 

private Vector3 healthBarScreenPosition; 

public PlayerCombat player; 
public Enemy target; 
public float healthPercent; 

void Start() { 

} 

void Update() { 
    if(player.opponent != null) { 
     target = player.opponent.GetComponent<Enemy>(); 
     healthPercent = (float)target.curHealth/(float)target.maxHealth; 

     Vector3 healthBarWorldPosition = (target.transform.position + new Vector3(0.0f, target.transform.lossyScale.y, 0.0f)); 
     healthBarScreenPosition = Camera.main.WorldToScreenPoint(healthBarWorldPosition); 
     left = healthBarScreenPosition.x - (healthBarWidth/2); 
     top = Screen.height - (healthBarScreenPosition.y + (healthBarHeight/2)); 
    } else { 
     target = null; 
     healthPercent = 0; 
    } 
} 

void OnGUI() { 
    if (target != null) { 
     GUI.DrawTexture(new Rect(left, top, 50, 5), healthBarFrame); 
     GUI.DrawTexture(new Rect(left, top, (50 * healthPercent), 5), healthBar); 
    } 
} 

이 난 적이 얼마나 많은 HP 보여 덤비는거야 무엇인가가 이해하기 쉽게 그래서 (나는 그냥 일반적으로, 다른 섹션에이 코드를 분리 :

여기 나의 건강 줄 클래스의 시도하고 위의 스크립트에 추가

//This is generic code taken from another user (with the variables unchanged) 
public Font font; 
public int fontSize = 8; 
public Vector3 Offset = Vector3.zero; // The offset from the character 

public Enemy target; 
public PlayerCombat player; 

private float health; 

private TextMesh bar; 

void Start() 
{ 
    target = player.opponent.GetComponent<Enemy>(); 
    // Setup the text mesh 
    bar = new GameObject("HealthBar").AddComponent("TextMesh") as TextMesh; 
    bar.gameObject.AddComponent("MeshRenderer"); 
    bar.gameObject.transform.parent = transform; 
    bar.transform.position = target.transform.position; 

    if(font) bar.font = font; 
    else bar.font = GUI.skin.font; 
    bar.renderer.material = font.material; 
    bar.characterSize = 0.25f; 
    bar.alignment = TextAlignment.Center; 
    bar.anchor = TextAnchor.MiddleCenter; 
    bar.fontSize = fontSize; 
} 

void Update() 
{ 
    target = player.opponent.GetComponent<Enemy>(); 
    health = target.curHealth; 
    if(bar.text != "HP:" + health.ToString()) bar.text = "HP: " + health.ToString(); 
} 

답변

0

당신은 줄과 텍스트의 서로 다른 시스템을 사용하고 가능한 원인이 작동하지 않는 이유 :..

  • 텍스트 메쉬가 막대 뒤에 그려집니다. 이는 GUI rendering is done after scene rendering이기 때문입니다.
  • 막대와 텍스트의 위치가 다릅니다. 막대를 상대방의 머리 위에 올리는 이유는 높이를 해당 위치에 추가하기 때문입니다. 그러나 본문은 여전히 ​​발에 남아 있습니다. 아마도 텍스트가 화면의 무언가 또는 외부에있을 것입니까?
  • 텍스트 메시가 카메라를 향하도록 회전하지 않습니다. 기본 글꼴 재질을 사용하면 뒷면에서 볼 수 있지만 재질에 따라 뒷면에서 볼 때 아무 것도 볼 수 없습니다. 메쉬에는 깊이가 없기 때문에 측면에서 보았을 때 재질에 관계없이 메쉬를 볼 수 없습니다. 이 문제를 해결하는

아마 가장 좋은 방법은 당신이 줄을 그릴 직후 OnGUI에서 투명한 배경()와 a label를 사용하여 텍스트를 그릴 것입니다. 이렇게하면 위치가 일치하고 텍스트가 막대 앞에 표시됩니다.

텍스트 메쉬가 어디에 나타나는지 편집기에서 확인하십시오. 거기에 문제가 있는지 확인하십시오. 어쩌면 잘못된 소재가 할당되었을 수도 있습니다. 위치가 꺼져있을 수 있습니다.

관련 문제