如何在Unity中在运行时设置不同的类

时间:2017-05-01 05:09:04

标签: c# unity3d architecture

我在Unity C#中制作游戏,角色在每个场景中都有不同的角色和动作功能。所以我试图为不同场景中的玩家设置不同的脚本,而所有脚本都继承自同一个基类。定义将如下所示

public class PlayerScript1 : PlayerBase { /* for scene 1*/
    public void Move(){
        /* my movement code*/
    }
}

同样,我有一个单独的Scene2类作为

public class PlayerScript2 : PlayerBase { /* for scene 2*/
    public void Move(){
        /* my movement code*/
    }
}

现在的问题是,我的其他脚本,如HealthScript,ScoreScript等,它们不随场景而改变。但他们确实访问了PlayerScript1脚本。这就是为什么,我在其中有PlayerScript1声明。如下所示:

public class HealthScript : MonoBehaviour {
    PlayerScript1 playerScript;
    void Start(){
        /*accessing the script attached to game object*/
    }
}

那么如何让我的健康脚本根据场景访问我的PlayerScript的不同实例?我知道我可以使用委托在运行时调用不同的方法,但是如何对类进行相同的操作呢?

2 个答案:

答案 0 :(得分:1)

  

那么如何让我的健康脚本根据场景访问我的PlayerScript的不同实例呢?

首先,您要声明该类型为var modal= $modal.open({ templateUrl: '...', controller: '...', resolve: { myList: function () { return $scope.lists; } } }); 的对象,因为您将无法将PlayerScript2的实例分配给PlayerScript1类型的变量:这些类可能从同一父类继承,但它们不一样,你不能从一个转换为另一个。

之后你需要在场景中搜索玩家对象,比如......

PlayerBase

当然,假设PlayerBase扩展了MonoBehaviour。如果它没有,你就不能以这种方式获得参考(因为它根本不存在于场景中)。此外,如果您希望此健康对象在场景之间持续存在,则需要为其调用DontDestroyOnLoad()(以及记住,如果您没有从场景1开始测试此对象,则会赢得&根本不存在,或者如果你在每个场景中都有副本,你就会遇到重复问题。

答案 1 :(得分:0)

有人在Unity论坛上回答了我的问题,这清除了我的疑虑: 关键是在我的HealthScript中使用以下行:

PlayerBase player = (PlayerBase)FindObjectOfType(typeof(PlayerBase));

http://answers.unity3d.com/answers/1348311/view.html