在 GameManager 中实例化玩家预制件后如何访问方法?
How to access methods after Instantiating a player prefab in 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>();
在您的 GameManager
的 Awake
方法中。
您当前实现的问题是您没有将实例化的 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();
,并且使用 GameManager.Instance.CurrentPlayer.AddXp();
应该可以。
我对 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>();
在您的 GameManager
的 Awake
方法中。
您当前实现的问题是您没有将实例化的 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();
,并且使用 GameManager.Instance.CurrentPlayer.AddXp();
应该可以。