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。