团结:球员耐力和速度操纵。 C#
Unity: Player Stamina and speed manipulation. c#
我已经为我的玩家添加了耐力,当耐力条为空时,玩家的速度会降低到 2。当他收集某种能量时,它会为他提供耐力。
当体力为空时我设置speed = 2
;当我收集能量时,我会稍微填充耐力条和 return 速度 (speed = 7;
)。
问题在另一个层面。在 lvl 2 中,地图不同,玩家也会改变。如果我在地图 1 和地图 2 中使用相同的速度,那么玩家在地图 2 中会非常快。考虑到这一点,速度是 public,我在检查器中对其进行了编辑。
现在我正在将我的速度硬编码为speed = 7
;这适用于所有场景和级别。我怎样才能让速度更快public,我可以只为这个场景编辑它,还是有办法说speed = otherSpeed
?
public void AddStamina(int a_staminaToAdd)
{
// Add stamina when we take coffee.
g_currStamina += a_staminaToAdd;
// Disable the "need stamina: text
g_lowStaminaTxt.enabled = false;
}
public void DeductStamina(int amount)
{
// only deduct stamina will player is moving on ground
if (isPlayerGrounded)
{
// How much stamina are we going to deduct when player is running?
g_currStamina -= amount;
// Change the slider value depending on the stamina
g_StaminaSlider.value = g_currStamina;
if (g_currStamina <= 0 )
{
//TODO : Go slower
m_speed = 2;
g_currStamina = 0;
g_lowStaminaTxt.enabled = true;
IsStaminaEmpty = true;
}
else
g_lowStaminaTxt.enabled = false;
}
}
将您的变量拉出函数作用域。并将它们添加到 class 级别。
class foo : monobehaviour
{
// Give a default value. This can be changed in the editor
public int SlowSpeed = 2;
public int FastSpeed = 7;
// Your functions somewhere here.
}
现在变量是在 class 级别上定义的,并且是 public
您可以使用编辑器统一更改值。默认情况下将使用 2 和 7,如果您在特定场景中更改这些值中的任何一个,这些值将在您更改它们时应用。
现在您需要将 m_speed = 2;
更改为 m_speed = SlowSpeed;
才能正常工作
通常的解决方案是使用静态成员。
一个好的解决方案是将玩家的数据值存储在单独的 class 中(因此它也对多人游戏友好),如 MyStatistics,实现如下静态属性:
public class MyStatistics
{
public static float Stamina { get; set; }
public static float Health { get; set; }
public static float Speed { get; set; }
}
但不是从 MonoBehaviour 继承,所以您不需要将它附加到游戏对象,您只需使用它们的完整限定名称就可以在代码中的任何地方使用它
//TODO : Go slower
MyStatistics.Speed = 2f;
MyStatistics.Stamina = 0f;
要永远记住的一件事是,在开始新游戏之前将这些数据重置为默认值,以防玩家死亡,否则他们会使用前一个游戏的数据开始新游戏,因为静态数据始终存在只要可执行文件是 运行.
我已经为我的玩家添加了耐力,当耐力条为空时,玩家的速度会降低到 2。当他收集某种能量时,它会为他提供耐力。
当体力为空时我设置speed = 2
;当我收集能量时,我会稍微填充耐力条和 return 速度 (speed = 7;
)。
问题在另一个层面。在 lvl 2 中,地图不同,玩家也会改变。如果我在地图 1 和地图 2 中使用相同的速度,那么玩家在地图 2 中会非常快。考虑到这一点,速度是 public,我在检查器中对其进行了编辑。
现在我正在将我的速度硬编码为speed = 7
;这适用于所有场景和级别。我怎样才能让速度更快public,我可以只为这个场景编辑它,还是有办法说speed = otherSpeed
?
public void AddStamina(int a_staminaToAdd)
{
// Add stamina when we take coffee.
g_currStamina += a_staminaToAdd;
// Disable the "need stamina: text
g_lowStaminaTxt.enabled = false;
}
public void DeductStamina(int amount)
{
// only deduct stamina will player is moving on ground
if (isPlayerGrounded)
{
// How much stamina are we going to deduct when player is running?
g_currStamina -= amount;
// Change the slider value depending on the stamina
g_StaminaSlider.value = g_currStamina;
if (g_currStamina <= 0 )
{
//TODO : Go slower
m_speed = 2;
g_currStamina = 0;
g_lowStaminaTxt.enabled = true;
IsStaminaEmpty = true;
}
else
g_lowStaminaTxt.enabled = false;
}
}
将您的变量拉出函数作用域。并将它们添加到 class 级别。
class foo : monobehaviour
{
// Give a default value. This can be changed in the editor
public int SlowSpeed = 2;
public int FastSpeed = 7;
// Your functions somewhere here.
}
现在变量是在 class 级别上定义的,并且是 public
您可以使用编辑器统一更改值。默认情况下将使用 2 和 7,如果您在特定场景中更改这些值中的任何一个,这些值将在您更改它们时应用。
现在您需要将 m_speed = 2;
更改为 m_speed = SlowSpeed;
才能正常工作
通常的解决方案是使用静态成员。
一个好的解决方案是将玩家的数据值存储在单独的 class 中(因此它也对多人游戏友好),如 MyStatistics,实现如下静态属性:
public class MyStatistics
{
public static float Stamina { get; set; }
public static float Health { get; set; }
public static float Speed { get; set; }
}
但不是从 MonoBehaviour 继承,所以您不需要将它附加到游戏对象,您只需使用它们的完整限定名称就可以在代码中的任何地方使用它
//TODO : Go slower
MyStatistics.Speed = 2f;
MyStatistics.Stamina = 0f;
要永远记住的一件事是,在开始新游戏之前将这些数据重置为默认值,以防玩家死亡,否则他们会使用前一个游戏的数据开始新游戏,因为静态数据始终存在只要可执行文件是 运行.