首页 > 解决方案 > 我无法通过代码更改滑块的值

问题描述

这是变量的代码:

public Slider healthSlider;
public Slider thirstSlider;
public Slider hungerSlider;
public float health;
public float hunger;
public float thirst;

这是一个可编写脚本的对象

public Descriptions apple;

我也这样做了:

healthSlider.value = health;
thirstSlider.value = thirst;
hungerSlider.value = hunger;
health = Mathf.Clamp(health, 0f, 100f);
thirst = Mathf.Clamp(thirst, 0f, 100f);
hunger = Mathf.Clamp(hunger, 0f, 100f);

这是我们编辑滑块值的地方:

public void Apple()
{
hunger = apple.hunger + hunger;
thirst = apple.thirst + thirst;
health = apple.health + health;
}

我也试过这个但它没有用:

public void Apple()
{
hunger += apple.hunger;
thirst += apple.thirst;
health += apple.health;
}

我也试过像这样直接访问它,但它不起作用:

hungerSlider.value += 0.1f;

我一直在尝试解决这个问题一段时间,但我无法弄清楚,任何帮助将不胜感激!谢谢!

标签: c#unity3d

解决方案


float类型,而不是引用类型!

当你这样做

这是我们编辑滑块值的地方:

public void Apple()
{
    hunger = apple.hunger + hunger;
    thirst = apple.thirst + thirst;
    health = apple.health + health;
}

->不,不是。您在这里所做的是更新您的本地字段hungerthirst并且health. 这些只是float字段,与您的滑块无关。

→ 这不会以任何方式影响滑块,直到您将这些值分配回它们,例如通过

hungerSlider.value = hunger;

还要

我也试过像这样直接访问它,但它不起作用:

hungerSlider.value += 0.1f;

好吧,从您的夹紧中,我假设您的滑块从0到 ,100因此变化0.1f几乎不会引起注意,因为它只是总滑块范围的 1/1000。


它可能应该是类似的东西

public void Apple()
{
    hungerSlider.value += apple.hunger;
    thirstSlider.value += apple.thirst;
    healthSlider.value += apple.health;
}

根本不要使用本地字段来镜像滑块值 - 它们只会引起混淆。除非您对一个值进行大量更改/计算,否则您将在仅存在于该方法内部的局部变量中执行它们,然后一次性将其分配回滑块属性,例如

var hunger = hungerSlider.value;
hunger += apple.hunger;
hunger = Mathf.Clamp(hunger, 0, 100);
hungerSlider.value = hunger;

或者,您可以将本地字段转换为Properties并执行例如

public float Hunger
{
    get { return hungerSlider.value; }
    set 
    {
        value = Mathf.Clamp(value, 0, 100);
        hungerSlider.value = value;
    }
}

这意味着每次你访问Hunger你实际得到的值是hungerSlider.value. 反之,每次您为您分配一个新值时,Hunger您实际上首先将其钳位,然后将其分配给hungerSlider.value.

这样做你现在可以简单地做

public void Apple()
{
    Hunger += apple.hunger;
    // etc
}

推荐阅读