在 GameManager 中实例化玩家预制件后如何访问方法?

问题描述

我对 unity 还很陌生,我正在尝试制作一款基于 mapBox 位置的游戏。现在我有一个受欢迎的场景,他们选择一个名字和一个角色(男性或女性),效果很好,他们选择了地图上的角色。

现在,我有三个脚本:GameManager、Player 和 BonusXP。在 GameManager 中,我正在实例化所选玩家并将其放置在地图上。

在播放器脚本中,我有某些变量,例如 xp 和级别以及诸如 AddXP() 之类的方法

在我附加到随机对象的bonusXP 脚本中,当点击该对象时,需要向玩家添加一定数量的XP。在这个例子中,我使用了 10。现在我让它工作正常,直到我添加了选择字符功能。在我将玩家拖入 GameManager 序列化字段之前,一切正常。现在那一个不见了。它停止工作。如何将 XP 添加用户选择的实例化播放器中?

The Gamemanager script:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : Singleton<GameManager> {

    public GameObject[] players;
    public Transform spawnPoint;
    private void Awake() {
        int selectedC = PlayerPrefs.GetInt("selectedcharacter");
        GameObject prefab = players[selectedC];
        GameObject clone = Instantiate(prefab,spawnPoint.position,Quaternion.identity);
        clone.AddComponent<Player>(); //attaches player script to the clone
    }

//  public Player CurrentPlayer {
//      get
//      {
//          if (currentPlayer == null) {
//          }
//          return currentPlayer;
//      }
//  }
  
}
`

BonusXP 脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class XPBonus : MonoBehavIoUr {

    [Serializefield] private int bonus = 10;

    private void OnMouseDown() {
        GameManager.Instance.CurrentPlayer.AddXp(bonus);
        Destroy(gameObject);
    }
}

播放器脚本的必要部分:

public class Player : MonoBehavIoUr {

    [Serializefield] private int xp = 0;
    [Serializefield] private int requiredXp = 100;
    [Serializefield] private int levelBase = 100;
    public void AddXp(int xp) {
        this.xp += Mathf.Max(0,xp);
    }
}

解决方法

首先,我建议将您的播放器创建为 Prefabs 并直接将您的 Player 脚本添加到它们中。这样你就不会打电话了:

 clone.AddComponent<Player>();

在您的 AwakeGameManager 方法中。

您当前实现的问题在于您没有将实例化的 Player 对象存储在任何地方。尝试这样的事情:

public Player CurrentPlayer {get; private set;}

private void Awake() {
    var selectedCharacter = PlayerPrefs.GetInt("selectedcharacter");
    var playerObj = Instantiate(players[selectedCharacter],spawnPoint.position,Quaternion.identity);
    CurrentPlayer = playerObj.GetComponent<Player>();
}

通过这种方式,您将 CurrentPlayer 设置为选定的一个,并且使用 GameManager.Instance.CurrentPlayer.AddXp(); 应该可以工作。