2014-10-20 26 views
2

我有這樣的代碼,我不知道爲什麼hit.collider.gameObject.GetComponent("health")被返回null不知道如何讓敵人的健康

void Shoot() { 
     Vector2 mousePosition = new Vector2 (Camera.main.ScreenToWorldPoint (Input.mousePosition).x, Camera.main.ScreenToWorldPoint (Input.mousePosition).y); 
     Vector2 firePointPosition = new Vector2 (firePoint.position.x, firePoint.position.y); 
     RaycastHit2D hit = Physics2D.Raycast (firePointPosition, mousePosition - firePointPosition, bulletRange, whatToHit); 
     if (Time.time >= timeToSpawnEffect) { 
      Effect(); 
      timeToSpawnEffect = Time.time + 1/effectSpawnRate; 
     } 

     if (hit.collider != null) { 
      if (hit.collider.name == "Enemy") { 
       Debug.Log(hit.collider.gameObject.GetComponent("health")); 
      } 
      //Debug.Log("We hit " + hit.collider.name + " and did " + damage + " damage"); 
     } 

    } 

這裏是我的敵人腳本

using UnityEngine; 
using System.Collections; 

public class EnemyAI : MonoBehaviour 
{ 

    public float health = 100f; 
    //... rest of the code 
} 
+0

值是你的類名爲'health',比如'health.cs'? 'GetComponent'區分大小寫。請參閱http://docs.unity3d.com/ScriptReference/GameObject.GetComponent.html – 2014-10-20 01:31:23

+0

上的最後描述,該類名爲EnemyAI.cs, 健康是一個公共浮動 – 2014-10-20 01:35:24

回答

3

您需要獲取對敵人腳本的引用。然後使用該腳本來操縱健康。

找到GameObject。

GameObject g = hit.collider.gameObject; 

獲取對腳本的引用。

EnemyAI e = g.GetComponent<EnemyAI>(); 

操縱健康。

e.health = 0f; 

在一個行,如果你想成爲壞蛋。

hit.collider.gameObject.GetComponent<EnemyAI>().health = 0.0f; 

特別提示:healthprivateEnemyAI應該有一個設置器和該變量的吸氣劑。

+0

謝謝,工作正常!你是什​​麼意思一個二傳手和一個吸氣? – 2014-10-20 17:59:18

+1

@SergioToledoPiza當你想保護一個變量直接訪問它的人時,你創建一個setter和一個getter。設置者讓你對變量進行更改。 getter返回變量的值。更深入的解釋http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – FunctionR 2014-10-21 07:20:21

0

您正在使用Unity你不是嗎?它看起來像你提供的代碼。 GetComponent()是一個方法,它返回對遊戲對象組件的引用。這些是您在編輯器中拖動到遊戲對象上的東西。比如盒子碰撞和Rigidbodys。您編寫的代碼不會返回任何內容,因爲Unity中沒有稱爲「健康」的遊戲組件。爲了獲得敵人的健康,你需要建立一個控制敵人腳本的參考,並從那裏獲得它的健康價值。

0

但是,您必須獲取附加到GameObject的腳本的引用。要做到這一點,你需要使用下面的代碼。

GameObject target; 

然後在您的拍攝方法中,您更新對目標的引用。

if(hit.collider.gameObject != target) 
{ 
    target = hit.collider.gameObject.GetComponent<EnemyAI>(); 
} 

圍繞它放置if()語句的原因是,如果目標尚未更改,則不會使用GetComponent請求重載CPU。

在這裏,您將只需更改使用的東西,如

target.value = newValue; 
target.SomeFunction();