首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >游戏对象的场景注入

游戏对象的场景注入
EN

Stack Overflow用户
提问于 2020-06-03 12:16:41
回答 1查看 568关注 0票数 0

所以我有带有GameState组件的游戏对象,还有带有SceneContext、GameInstaller组件的游戏对象。GameInstaller有用于GameState的字段,我还将GameInstaller引用为单安装程序。当我从prefab实例化player游戏对象时--它在GameState字段上具有Inject属性,并试图使用GameState组件访问场景中的每个游戏对象--我得到的是空引用。

这就是我是绑定的样子,我就是这样的注射法 (它是我的敌人/玩家的基类)

代码语言:javascript
复制
public class GroundEnemy : AbstractUnit

    public override void SetDefaultConfig(UnitData groundEnemyData, Camera camera, Player target)
{
    Debug.Log(gameState + " - gamestate ref in " + this.name);
    this.target = target;
    healthbarCanvas.worldCamera = camera;
    maxHealth = currentHealth = groundEnemyData.Health;
    speed = groundEnemyData.UnitSpeed;
    collisionDamage = groundEnemyData.UnitColisionDmg;
    gameState.OnGameLost.AddListener(this.LostGame);
}

好吧,与gameState.OnGameLost一致-我有一个空引用。我在基类中所做的GameState注入,这是从monobeh派生的。

这就是我如何用播放器/敌人脚本实例化预制板的方法

代码语言:javascript
复制
public class Spawner : MonoBehaviour

{
[InjectOptional] private Player injectedPlayer;
[SerializeField] private LevelLoader levelLoader;
[SerializeField] private CameraTracker camTracker;    
[SerializeField] private Joystick joystick;
[Inject(Id = "Player")] private UnitData playerEntity;
[Inject(Id = "Fly Enemy")] private UnitData flyEntity;
[Inject(Id = "Ground Enemy")] private UnitData groundEntity;
[Inject(Id = "Boss Enemy")] private UnitData bossEntity;
[Inject] private ArenaData arenaData;
[Inject] private GameState gameState;
[Header("Prefabs")]
[SerializeField] private Player playerPrefab;
[SerializeField] private FlyEnemy flyEnemyPrefab;
[SerializeField] private GroundEnemy groundEnemyPrefab;
[SerializeField] private BossEnemy bossEnemyPrefab;
[HideInInspector] public List<AbstractUnit> AliveEnemies = new List<AbstractUnit>();
private Player cashedPlayer;

private void Start()
{
    InstantiateEntities();
}

private void InstantiateEntities()
{
    if (injectedPlayer != null)
    {
        var player = Instantiate(injectedPlayer, arenaData.PlayerSpawnPos, Quaternion.identity);
        player.HealthbarCanvas = camTracker.PriorCamera;
        ExtraSetup(player);
    }
    else
    {
        var player = Instantiate(playerPrefab, arenaData.PlayerSpawnPos, Quaternion.identity);
        player.SetDefaultConfig(playerEntity, camTracker.PriorCamera);
        ExtraSetup(player);
    }

    if (arenaData.FlySpawnPoints.Count != 0)
    {
        for (int i = 0; i < arenaData.FlySpawnPoints.Count; i++)
        {
            var entity = Instantiate(flyEnemyPrefab, arenaData.FlySpawnPoints[i], Quaternion.identity);
            AliveEnemies.Add(entity);
            entity.SetDefaultConfig(flyEntity, camTracker.PriorCamera, cashedPlayer);
        }
    }

    if (arenaData.GroundSpawnPoints.Count != 0)
    {
        for (int i = 0; i < arenaData.GroundSpawnPoints.Count; i++)
        {
            var entity = Instantiate(groundEnemyPrefab, arenaData.GroundSpawnPoints[i], Quaternion.identity);
            AliveEnemies.Add(entity);
            entity.SetDefaultConfig(groundEntity, camTracker.PriorCamera, cashedPlayer);
        }
    }

    if (arenaData.BossSpawnPos != Vector2.zero)
    {
        var entity = Instantiate(bossEnemyPrefab, arenaData.BossSpawnPos, Quaternion.identity);
        AliveEnemies.Add(entity);
        entity.SetDefaultConfig(bossEntity, camTracker.PriorCamera, cashedPlayer);
    }
}

private void ExtraSetup(Player player) 
{
    camTracker.SetTarget(player.transform);
    joystick.player = player;
    joystick.gameObject.SetActive(true);
    cashedPlayer = player;
}

public void RemoveEnemy(AbstractUnit abstractUnit)
{
    AliveEnemies.Remove(abstractUnit);
    if (AliveEnemies.IsEmpty())
    {
        gameState.OnPlayerWinLvl?.Invoke();
        if (SceneManager.GetActiveScene().buildIndex + 1 != SceneManager.sceneCount)
        {
            StartCoroutine(levelLoader.LoadScene(SceneManager.GetActiveScene().buildIndex + 1, cashedPlayer));
        }
    }
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-03 13:37:59

您需要绑定FromInstance,如下所示:

代码语言:javascript
复制
Container.BindInterfacesAndSelfTo<GameState>().FromInstance(_myGameStateReference).AsSingle();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62172635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档