Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# AI火灾脚本-错误-GetComponent<;脚本名称>;()函数名()_C#_Unity3d - Fatal编程技术网

C# AI火灾脚本-错误-GetComponent<;脚本名称>;()函数名()

C# AI火灾脚本-错误-GetComponent<;脚本名称>;()函数名(),c#,unity3d,C#,Unity3d,我试图创建ai火灾脚本。 首先,脚本为射击位置随机创建两个数字,并检查位置是否有军队目标或地面目标。 若有军队目标,则施加伤害直到摧毁它,但若有地面目标,则只标记它已被射击,因为我希望ai脚本不会第二次射击地面目标 有一个问题是NullReferenceException:对象引用未设置为对象的实例 错误行GetComponent().startEnemyFire() 这里是ai火脚本 public class EnemyFire : MonoBehaviour { public in

我试图创建ai火灾脚本。 首先,脚本为射击位置随机创建两个数字,并检查位置是否有军队目标或地面目标。 若有军队目标,则施加伤害直到摧毁它,但若有地面目标,则只标记它已被射击,因为我希望ai脚本不会第二次射击地面目标

有一个问题是NullReferenceException:对象引用未设置为对象的实例 错误行GetComponent().startEnemyFire()

这里是ai火脚本

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将其作为属性。谢谢您的建议,我将处理它