C# GameObject.FindGameObjectWithTag不是';t寻找克隆

C# GameObject.FindGameObjectWithTag不是';t寻找克隆,c#,unity3d,C#,Unity3d,我有一个统一的脚本,实例化了一个敌人预制和另一个脚本,移动敌人取决于那里的标签。但是,已实例化的游戏对象正在被检测到,但不会移动例如: 当我暂停游戏并手动添加一个敌人预制物时,它会移动,但当脚本自动添加它时,它不会移动 下面是我的实例化脚本: 和我的敌人控制者脚本(移动敌人) void FixedUpdate() { /*游戏对象[]*/ var objects=GameObject.FindGameObjectsWithTag(“敌人”); var objectCount=objects.L

我有一个统一的脚本,实例化了一个敌人预制和另一个脚本,移动敌人取决于那里的标签。但是,已实例化的游戏对象正在被检测到,但不会移动例如: 当我暂停游戏并手动添加一个敌人预制物时,它会移动,但当脚本自动添加它时,它不会移动


下面是我的实例化脚本:

和我的敌人控制者脚本(移动敌人)

void FixedUpdate()
{
/*游戏对象[]*/
var objects=GameObject.FindGameObjectsWithTag(“敌人”);
var objectCount=objects.Length;
foreach(对象中的var obj)
{
//相应地移动玩家
var rb=obj.GetComponent();
Debug.Log(rb);
向量2方向=(player.position-obj.transform.position)。标准化;
rb.速度=方向*移动速度;
}
}
如果需要,这里是敌人预制场的图像:

您应该能够解决这个问题,而且这个问题可能在您的项目中的其他地方。 我创建了一个示例项目,该项目重新创建了您尝试执行的操作,并尝试与您发送的示例代码尽可能相似,您可以在此处找到它:

据我所见,您的控制台正在发送一个异常

get_main is not allowed to be called...
我想到的是,这个异常正在破坏整个执行过程,这就是为什么什么都没有发生

顺便说一句,我不知道你的项目,所以我真的不知道你为什么要这样做。那么,你为什么不创建一个附在敌人预制场上的敌人脚本呢?如果你有很多敌人,你将在每次更新中找到并遍历所有敌人。如果你创建了一个敌人的脚本并将其附加到预置,你应该能够使用脚本所附加到的游戏对象的变换来处理敌人的移动。这样,每个敌人都是一个独立的实体

我希望所有这些都有帮助

编辑:
我编辑了回购协议,并添加了一个名为“个人敌人”的场景,该场景演示了我在评论中告诉您的内容

如果您希望敌人跟随玩家,请尝试执行以下操作:

//Attach this script to the enemy

Transform player;
private Rigidbody2D rb;
private Vector2 movement;
public float moveSpeed;

    void Awake()
{
    player = ScriptNameOnPlayer.instance.gameObject.transform;

}


// Start is called before the first frame update
void Start()
{
    rb = this.GetComponent<Rigidbody2D>();
}

void Update()
{

    Vector3 direction = player.position - transform.position;
    direction.Normalize();
    movement = direction;  
}

void FixedUpdate()
{
    moveCharacter(movement);
}

void moveCharacter(Vector2 direction)
{
    rb.MovePosition((Vector2)transform.position + (direction * moveSpeed * Time.deltaTime));
}


//But make sure your player script has this line of code:

public static ScriptNameOnPlayer instance;
//将此脚本附加到敌人
转换玩家;
私有刚体2d rb;
私人矢量2运动;
公共交通速度;
无效唤醒()
{
player=ScriptNameOnPlayer.instance.gameObject.transform;
}
//在第一帧更新之前调用Start
void Start()
{
rb=this.GetComponent();
}
无效更新()
{
Vector3方向=player.position-transform.position;
方向。规范化();
运动=方向;
}
void FixedUpdate()
{
移动字符(移动);
}
无效移动字符(矢量2方向)
{
rb.MovePosition((Vector2)transform.position+(direction*moveSpeed*Time.deltaTime));
}
//但请确保您的播放器脚本包含以下代码行:
公共静态ScriptNameOnPlayer实例;

希望这有帮助

如果我创建单独的敌人脚本移动他们,他们都将处于相同的位置,因为他们都使用相同的脚本。我希望他们能够独立移动。不,他们不会,这不是Unity游戏对象的工作方式。每次你实例化一个游戏对象时,附加到它的敌人类都会被实例化,并从敌人类中创建一个新的“敌人”对象。除非你在你的类中使用静态变量,否则你不会遇到你提到的问题。我已经编辑了repo,并添加了一个名为“IndividualEquires”的场景,演示了它是如何工作的。Unity以基于组件的系统为核心,你应该努力利用它。是的,谢谢我看了一下,我错了。谢谢你的帮助!Mmm不工作,我得到错误“对象引用未设置为对象的实例”。
get_main is not allowed to be called...
//Attach this script to the enemy

Transform player;
private Rigidbody2D rb;
private Vector2 movement;
public float moveSpeed;

    void Awake()
{
    player = ScriptNameOnPlayer.instance.gameObject.transform;

}


// Start is called before the first frame update
void Start()
{
    rb = this.GetComponent<Rigidbody2D>();
}

void Update()
{

    Vector3 direction = player.position - transform.position;
    direction.Normalize();
    movement = direction;  
}

void FixedUpdate()
{
    moveCharacter(movement);
}

void moveCharacter(Vector2 direction)
{
    rb.MovePosition((Vector2)transform.position + (direction * moveSpeed * Time.deltaTime));
}


//But make sure your player script has this line of code:

public static ScriptNameOnPlayer instance;