我有这段代码而且我不知道为什么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 :(得分:3)
您需要获取对敌人附加脚本的引用。然后使用该脚本来操纵健康状况。
找到GameObject。
GameObject g = hit.collider.gameObject;
获取脚本的引用。
EnemyAI e = g.GetComponent<EnemyAI>();
操纵健康。
e.health = 0f;
如果你想成为坏人,请在一行中。
hit.collider.gameObject.GetComponent<EnemyAI>().health = 0.0f;
额外提示:health
应该是private
而EnemyAI
应该有一个setter和该变量的getter。
答案 1 :(得分:0)
你使用Unity不是吗?它看起来就像你提供的代码一样。 GetComponent()是一个返回对游戏对象组件的引用的方法。这些是您在编辑器中拖动到游戏对象上的内容。像Box-Colliders和Rigidbodys这样的东西。您编写的代码不会返回任何内容,因为Unity中没有称为“运行状况”的游戏组件。为了获得敌人的健康,你需要建立一个对控制敌人的脚本的引用,并从中获取其健康值。
答案 2 :(得分:0)
但是,您必须获取附加到GameObject的脚本的引用。为此,您需要使用以下代码。
GameObject target;
然后在拍摄方法中更新目标的参考。
if(hit.collider.gameObject != target)
{
target = hit.collider.gameObject.GetComponent<EnemyAI>();
}
我在其周围放置一个if()语句的原因是,如果目标尚未更改,则不会使用GetComponent请求重载CPU。
从这里开始,您只需使用
等内容来更改值target.value = newValue;
target.SomeFunction();