Unity:玩家耐力和速度操控。 C#

时间:2016-11-18 10:29:12

标签: c# unity3d unity5

我已经为我的玩家添加了耐力,当耐力栏为空时,玩家速度降低到2.当他收集一定的力量时,它会给予他耐力。

当耐力为空时,我设置speed = 2;当我收集通电时,我会稍微填充耐力栏并返回速度(speed = 7;)。

问题出在另一个层面。在lvl 2中,地图是不同的,玩家将改变。如果我在地图1和地图2中使用相同的速度,那么玩家将在map2中非常快。为了解释这一点,速度是公开的,我在检查员中编辑它。

现在我很难将速度编码为speed = 7;这适用于所有场景和关卡。如何让速度更加公开,我可以仅针对此场景进行编辑,还是可以说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;
    }

}

2 个答案:

答案 0 :(得分:3)

将变量拉出函数范围。并将它们添加到班级。

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.
}

既然变量是在类级别定义的,并且是public,您可以使用编辑器统一更改值。默认情况下,将使用2和7,如果在特定场景中更改这些值中的任何一个,则在更改时将应用这些值。

现在您需要将m_speed = 2;更改为m_speed = SlowSpeed;才能使其正常工作

答案 1 :(得分:2)

通常的解决方案是使用静态成员。

一个好的解决方案是将播放器的数据值存储在一个单独的类中(因此它也是多人友好的),如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;

要记住的一件事是在玩家死亡之前将这些数据重置为默认值,以防玩家死亡,否则他们会使用前一个数据开始一个新游戏,因为静态保持在那里因为可执行文件正在运行。