首页 > 解决方案 > 实例化对象不实例化其他对象

问题描述

我想让玩家创建一个“canon base”,它会自动拍摄一些“canon ball”,但是(在使用一些 Debug.Log 尝试之后)我可以说只有在实例化“canon ball”之前的代码才会被执行: (

据说是多人游戏。

using UnityEngine.Networking;

public class PlayerScript : NewtworkBehaviour
{
  public GameObject canonBase;
  public Transform canonBaseSpawnPoint;

 void Update()
 {
    if (Input.GetKeyDown(KeyCode.R))
    {
        CmdCreateCanon();
    }
 } 

 [Command] 
 void CmdCreateCanon()
 {
    GameObject _canonBase = Instantiate(canonBase.gameObject, 
    canonBaseSpawnPoint.transform.position, Quaternion.identity);
    _canonBase.transform.rotation = canonBaseSpawnPoint.transform.rotation;
    NetworkServer.SpawnWithClientAuthority(_canonBase, connectionToClient);

   }
}
//other script:

using System.Timers;
using UnityEngine.Networking;

public class CanonScript : NetworkBehaviour
{
  public GameObject canonBall;
  public Transform canonSpawnPoint;
  public int shootAmount;

void Start()
{
    shoot = new Timer(shootTime * 1000);
    shoot.Elapsed += Shoot_Elapsed;
    shoot.Start();
}

void Shoot_Elapsed(object sender, ElapsedEventArgs e)
  {
  for (int  i = 0; i < shootAmount; i++)
  {
    //Code written down here gets executed
    GameObject _canonBall = Instantiate(CanonBall.gameObject, canonSpawnPoint.transform.position, Quaternion.identity) as GameObject;
    _canonBall.transform.rotation = canonSpawnPoint.transform.rotation;
    //Code written down here doesn't get Instantiated 
  }
 }
}

添加:

使用 Debug.Log() 我发现 for 循环中的代码被执行,但 canonBall-Instantiation-code 后面的所有内容都没有。

canonBall 与 BulletScript 链接,因此它被移动(这应该没问题,因为它也适用于其他对象)。

“...SpawnPoint”s 是禁用 Mesh Renderer 和 Box Collider 的立方体,并附加到实例化另一个对象所需的 GameObject (Player --> canonBase; canonBase --> canonBall

编辑:现在我认为由于for循环左右它不起作用?(因为让 Player 直接创建一个 canonBall(没有计时器和 for 循环部分)就可以正常工作)

标签: c#unity3dinstantiation

解决方案


你可以Start像这样制作一个协程。

using System.Collections;
using UnityEngine;


public class Cannon : MonoBehaviour {

    [SerializeField] private GameObject _cannonballPrefab;


    private IEnumerator Start () {
        yield return new WaitForSeconds (2);
        Instantiate (_cannonballPrefab);
    }
}

当您实例化带有此脚本的大炮时,将在 2 秒延迟后创建炮弹。


推荐阅读