C# AI火灾脚本-错误-GetComponent<;脚本名称>;()函数名()
我试图创建ai火灾脚本。 首先,脚本为射击位置随机创建两个数字,并检查位置是否有军队目标或地面目标。 若有军队目标,则施加伤害直到摧毁它,但若有地面目标,则只标记它已被射击,因为我希望ai脚本不会第二次射击地面目标 有一个问题是NullReferenceException:对象引用未设置为对象的实例 错误行GetComponent().startEnemyFire() 这里是ai火脚本C# AI火灾脚本-错误-GetComponent<;脚本名称>;()函数名(),c#,unity3d,C#,Unity3d,我试图创建ai火灾脚本。 首先,脚本为射击位置随机创建两个数字,并检查位置是否有军队目标或地面目标。 若有军队目标,则施加伤害直到摧毁它,但若有地面目标,则只标记它已被射击,因为我希望ai脚本不会第二次射击地面目标 有一个问题是NullReferenceException:对象引用未设置为对象的实例 错误行GetComponent().startEnemyFire() 这里是ai火脚本 public class EnemyFire : MonoBehaviour { public in
public class EnemyFire : MonoBehaviour {
public int min;
public int max;
public static int enemyDamage=2;
public static bool empty;
void Start(){
empty=true;
}
public void startEnemyFire(){
if(empty==true){
Debug.Log("create Position");
createPosition();
}
if(empty==false){
shot();
}
}
public void createPosition(){
min=Random.Range(0,5);
max=Random.Range(0,5);
shot();
}
void shot(){
Vector2 pos=new Vector3(min,max,0);
RaycastHit2D hit = Physics2D.Raycast ((pos), -Vector2.up);
if(hit.collider != null)
{
GameObject target = hit.collider.gameObject;
if(target.tag=="army"){
target.GetComponent<playerArmyMove>().Damaged(enemyDamage);
empty=false;
Debug.Log("army shoted");
}
if(target.tag=="floor"){
target.GetComponent<FloorScript>().changeSprite(enemyDamage);
Debug.Log("floor shoted");
}
}
}
}
公共类EnemyFire:单一行为{
公共int min;
公共整数最大值;
公共静电损伤=2;
公共静态布尔空;
void Start(){
空=真;
}
公共空间startEnemyFire(){
如果(空==真){
Log(“创建位置”);
createPosition();
}
if(空==假){
shot();
}
}
公共职位(){
最小值=随机范围(0,5);
最大值=随机范围(0,5);
shot();
}
无效射击(){
矢量2位置=新矢量3(最小值、最大值、0);
RaycastHit2D hit=Physics2D.Raycast((位置),-Vector2.up);
if(hit.collider!=null)
{
GameObject target=hit.collider.GameObject;
if(target.tag==“陆军”){
target.GetComponent()已损坏(enemyDamage);
空=假;
调试日志(“军队拍摄”);
}
if(target.tag==“floor”){
target.GetComponent().changeSprite(enemyDamage);
调试日志(“地板拍摄”);
}
}
}
}
这里是剧本
public class FloorScript : MonoBehaviour {
public Sprite damageSprite;
public bool shot =false;
public int hp=1;
public void changeSprite( int value){
if(shot ==true){
GetComponent<EnemyFire>().createPosition(); //Error is here
}
if(shot ==false){
hp-=value;
if(hp <= 0)
{
GetComponent<SpriteRenderer>().sprite = damageSprite;
shot=true;
}
}
}
}
公共类FloorScript:MonoBehavior{
公共雪碧损坏雪碧;
公共bool shot=false;
公共int hp=1;
公共void changeSprite(int值){
如果(shot==true){
GetComponent().createPosition();//此处有错误
}
如果(shot==false){
hp-=数值;
如果(hp将EnemyFire
脚本附加到编辑器中附加到FloorScript
脚本的同一游戏对象。将EnemyFire
脚本附加到编辑器中附加到的FloorScript
脚本的同一游戏对象。在频繁执行的代码中不应使用GetComponent
y、 您应该在Start()
方法中创建一个字段并对其进行初始化。如果此组件被其他组件使用,请将其作为私有setter的属性。谢谢您的建议,我将处理它。您不应该在频繁执行的代码中使用GetComponent
。您应该在Start()中创建一个字段并对其进行初始化
方法。如果此组件被其他组件使用,请使用private setter将其作为属性。谢谢您的建议,我将处理它