我正在尝试为游戏中的加电功能实现一个系统,但不确定如何实现。到目前为止,我有一个powerup生成器,它可以在随机位置上实例化powerup预制件。一旦被拾取,它就会自我毁灭并在另一个位置产生。所有电源都使用相同的预制件,一次地图上只有一个。
spawnLocations = GameObject.FindGameObjectsWithTag("spawnLocation");
Instantiate(powerup, spawnLocations[spawnRandom].transform.position, transform.rotation);
至于力量道具,当它被拾取时,它应该移除当前的力量(如果玩家拥有),并用随机选择的新力量替换它。 (无需计时器)。
我做了几个简单的道具:
public void SpeeedBoost(float speedMultiplied) {
var playerController = gameObject.GetComponent<PlayerController>();
playerController.speed = playerController.speed * speedMultiplied;
}
public void JumpBoost(float jumpPower) {
var playerJump = gameObject.GetComponent<PlayerJump>();
playerJump.jumpSpeed = playerJump.jumpSpeed * jumpPower;
}
+可能是武器的变更等。
它们应该这样称呼:
private void OnTriggerEnter2D(Collider2D collision) {
if (collision.gameObject.tag == "powerup") {
// Remove current powerup and call a new random one
}
}
所以我在这里需要一些帮助。我应该如何构造我的能量提升?而且我怎么称呼他们呢?考虑为此可能使用unityEvent。或者,可以将每个加电功能保存为带有其自己的脚本的预制件并交换它们(尽管感觉有些混乱)。
我在这里有点迷路,任何建议/示例都值得赞赏。 :)
答案 0 :(得分:2)
您可以枚举powerUps
public enum PowerUp
{
None, //default value
SpeedBoost,
JumpBoost,
//etc
}
然后创建对当前活动的PowerUp的引用
private PowerUp currentPowerUp;
这样一来,我们可以在分配新值之前取消其效果
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.gameObject.tag == "powerup")
{
switch (currentPowerUp)
{
case PowerUp.JumpBoost:
RemoveJumpBoost();
break;
case PowerUp.SpeedBoost:
RemoveSpeedBoost();
break;
}
do
{
//I set the minimum value to 1 to skip "None"
var nextPowerUp = (PowerUp)UnityEngine.Random.Range(1, System.Enum.GetValues(typeof(PowerUp)).Length);
}
while (nextPowerUp == currentPowerUp);
switch (nextPowerUp)
{
case PowerUp.JumpBoost:
AddJumpBoost();
break;
case PowerUp.SpeedBoost:
AddSpeedBoost();
break;
}
currentPowerUp = nextPowerUp;
}
}
或者您也可以在powerUp预制中添加脚本,在其中指定上述powerUp枚举值,甚至在OnDestroy事件上声明该做什么。或者,您可以为每种powerUp类型创建一个预制件,并在确定实例化哪个实例之前调用随机生成。由您决定哪种解决方案看起来最干净,最容易理解,它们都是完全有效的
答案 1 :(得分:1)
我认为您可以将ScriptAbleObjects用于PowerUps。它会引用它产生的预制件。为了使其随机化,我将它们存储在一个列表中,并计算一个随机索引来检索随机加电。
public class PowerUpObject : ScriptAbleObject
{
public GameObject Prefab;
}
public class PowerUpManager : Monobehaviour
{
public List<PowerUpObject> PowerUps;
public PowerUp GetRandomPowerUp()
{
if(PowerUps != null && PowerUps.Count > 0)
{
int randomIdx = Random.Range(0, PowerUps.Count);
return PowerUps[randomIdx];
}
// error case
Debug.Log("No PowerUps in List");
return null;
}
}
这还不完整,但是应该为您提供所需的灵感。 您将拥有一个管理器GameObject来保存游戏中所有已知的powerUps。您可以从中请求随机加电,然后使用PowerUpObject的Prefab成员生成实际的Prefab。