2017-06-19 54 views
2

我在我的统一游戏中有一个门户。通过输入触发器,它应该加载一个场景。所以这段代码真的很短,这里是:Unity中的重构代码通过不使用检查员

public class PortalData : EnvironmentCommonData // the data class with some information 
{ 
    public PortalData(string sceneToLoad) // set the scene in the constructor 
    { 
     SceneToLoad = sceneToLoad; 
    } 

    public string SceneToLoad { get; set; } // the scene to load when entering 
} 

public class PortalController : EnvironmentCommonController // the portal class 
{ 
    [SerializeField] 
    string sceneToLoad; // set the scene in the inspector 

    private PortalData data; 

    private void Start() 
    { 
     data = new PortalData(sceneToLoad); // instance for the data class 
    } 

    private void OnTriggerEnter(Collider col) // player enters the trigger 
    { 
     if (CheckCollision(col, data.PlayerObject)) // is the entering object the player? 
      LoadScene(data.SceneToLoad); // load the new scene 
    } 
} 

所以我正在寻找一个聪明的方式不使用督察。我想通过脚本自动完成。

所以我试图设置控制器摘要,并创建了不同的控制器类继承这个控制器,但这不是优雅的。

在这里,你可以看到我尝试的例子:

https://hastebin.com/utuqubafuz.cs

是否有人有一个想法?

那么完美的剧本是这样的

public class Portal : Monobehaviour 
{ 
    string sceneToLoad = ""; 

    void OnTriggerEnter(Collider col) 
    { 
     if(col.gameObject.tag == "Player") 
      LoadScene(sceneToLoad); 
    } 
} 

,但我不想检查,如果可能的话。

+0

你必须在某处创建它们。如果你已经在场景中产生了它们,只需使用Inspector即可。如果你使用代码创建它们,那就是你要指定字符串的地方。 – Draco18s

+0

你想从运行时产生'sceneToLoad'变量的值吗?如果是这样,你的场景名称是什么? – Programmer

回答

1

你可以有PortalSpawner实例化GameObject S,通过AddComponent()重视Portal对象给他们,并设置string newPortal.sceneToLoad。尽管这可能会避免使用Inspector设置字符串,但它仍然需要您在某处指定字符串,如评论中提到的@ Draco18s。

其它方式将是:

  1. 子类已明确宣布string sceneToLoad每一个场景,
  2. 重用预制件在不同地点的同一场景,
  3. ,如果它的写string要避免,你可以使用enum并检查每个枚举值和负载场景accrodingly(代码会看起来更肮脏,但可能使检查器清洁),或
  4. 做一个JSON文件(或任何其他da tabase或可序列化的文本),您可以在其中存储Portal要产生的对象的位置,其中每个对象都应包含这些对象。最终这将回到AddComponent()方法。

JSON方法可能更接近您正在寻找的内容,但它需要一些更多的工作,我不确定是否值得努力。

如果这些不是您正在寻找的解决方案,请提供您希望自动执行的步骤。无论如何,sceneToLoad必须指定在某个点上。我相信督察领域是在Unity中做这件事的通用场所。

作为一个方面,坚持现场命名约定可能会使一些过程更容易。例如,场景名称必须是sceneNumber_k,其中k是场景的索引,而第k个Portal将打开第k个场景。通过这种命名约定,初始化字符串的过程中的一些过程可能是自动化