Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 如何访问Unity中已实例化的目标?_C#_Unity3d - Fatal编程技术网

C# 如何访问Unity中已实例化的目标?

C# 如何访问Unity中已实例化的目标?,c#,unity3d,C#,Unity3d,我正在制作一个游戏,我需要在游戏开始时产生一个玩家。然后我会得到那个球员的位置,但我不知道怎么做。这是我的密码: GameObject playerball; Transform spawpoint; bool spaw private void Start(){ spaw = false; } private void Update() { if(!spaw) { Instantiate(playerball, spawpoint.position, sp

我正在制作一个游戏,我需要在游戏开始时产生一个玩家。然后我会得到那个球员的位置,但我不知道怎么做。这是我的密码:

GameObject playerball;
Transform spawpoint;
bool spaw

private void Start(){
    spaw = false;
}

private void Update()
{
   if(!spaw)
   {
       Instantiate(playerball, spawpoint.position, spawpoint.rotation);
       spaw=true;
   }

   //????????????
}
如你所见,我不知道如何进入那个球。该playerball是保存控制脚本的预置,该脚本具有“Transform public Camera”,但预置中的“public Transform Camera”是“None(Transform)”。所以我需要,当我实例化playerball时,我可以控制它,这意味着我可以设置“公共变换摄影机”。如何执行此操作?

返回对刚刚实例化的对象的引用。您只需保留该参考资料,并根据自己的需要进行处理:

GameObject instance = Instantiate(playerball, spawpoint.position, spawpoint.rotation);
此外,此行缺少分号:

bool spaw
整个代码将给出:

GameObject playerball;
Transform spawpoint;
bool spaw;
GameObject playerballObject;

private void Start(){
    spaw = false;
}

private void Update()
{
    if(!spaw)
    {
        playerballObject = GameObject.Instantiate(playerball, spawpoint.position, spawpoint.rotation);
        spaw=true;

        // Do any first time modification you need on your object.
    }

    // Use your reference there to update the state of your object.
}

替代脚本,进行一些Isuka没有做的更改,以提高效率、干净的代码和良好的实践

public GameObject playerballPrefab;
public Transform spawpoint;
private GameObject playerballInstance;

private void Update()
{
   if(playerballInstance == null)
   {
       playerballInstance = Instantiate(playerballPrefab, spawpoint.position, spawpoint.rotation);
      // Other spawn logic / modification
   }

   //do stuff with playerballInstance every frame
}
请注意,我们不再需要
bool spawn
变量(呃,
spaw
拼写错误),因为我们可以检查
playerballistance
是否为空,如果为空,则生成它。任何时候它为空(例如,如果它被以任何方式破坏),我们都会生成一个新的(我将其重命名为
playerbllprefab
,以便变量的名称指示该对象不在场景层次结构中;纯为可选),就像外部脚本将
spawn
重置为false一样,但是没有任何潜在冲突(例如,将
spawn
设置为false而不销毁实例,反之亦然)

此外,我们永久持有该引用,以便可以连续地对球进行操作,而不是对其实例化的单个帧进行操作。Isuka编辑了他们的答案以包含这一变化

playerbillistance
可以设置为public(因为我们希望外部脚本修改该值)或private(因为不应该有其他脚本接触它)。预设和转换被声明为公共的,因为它们可能是在编辑器/检查器中定义的(私有字段未列出且不可序列化)

不再需要Start方法,因为我们不再有一个
spawn
值来确保设置为我们想要的值(以及最初不需要的值,以及我们可以在没有Start()方法的情况下声明
bool spawn=false


Start()
Update()
标记为private也不是绝对必要的,但也没有错。同样地,将其标记为公开也不是必要或错误的。我个人要么放弃它(从MonoBehavior继承其保护级别),要么将其标记为公共(因为所有MonoBehavior都声明了此方法)。当引擎被调用时,使用什么样的保护级别对引擎没有影响。

因此,这意味着“实例”将拥有被spawed的“玩家球”的位置?@Huy.V。它是对场景中实例化的Playerball对象的直接引用。因此,这两个
变换.position
分量是相等的。如果你修改了该引用上的任何内容,它将影响场景中的对象。注意……你可能希望在更新方法之外有
GameObject实例
声明,使其持续时间超过一帧。这有点取决于他想用它实现什么。对我来说,代码的这个实例化部分甚至应该放在Start函数中,这样它只运行一次,而不是像那样在更新中运行。不过,OP可能有这样的原因。如果它是一次性修改,那么声明应该在
If(!spawn)检查中。
避免了不必要的If(instance!=null)检查,因为它不会为null的唯一时间是我们已经检查过的If spawn为false。