【问题标题】:add variables to list and assign values to them in a loop?将变量添加到列表中并在循环中为它们赋值?
【发布时间】:2019-11-07 12:08:36
【问题描述】:

我有一些来自不同类AnalogGlitch 的参数,我想在这段代码中分配它们。我不想单独为它们分配值,而是想将它们打包在一个列表中并在循环中打包。

但是从输出中我可以看到变量的值根本没有改变。我以前没有用过那么多 C#,想知道这是否是该语言特有的东西(而不是在 python 中)?

当我将值单独分配给变量而不是循环时,代码可以正常工作...

public class SlenderInView : MonoBehaviour
{
    private AnalogGlitch glitch;

    private bool isLooking = false;

    private List<float> controls = new List<float>();

    void Start()
    {
        glitch = GetComponent<AnalogGlitch>();

        controls.Add(glitch.scanLineJitter);
        controls.Add(glitch.horizontalShake);
        controls.Add(glitch.colorDrift);
    }

    void Update()
    {
        // removed the code dealing with isLooking

        if (isLooking)
        {   
            for(int i=0; i<controls.Count; i++)
            {
                if(controls[i] < 1)
                {
                    controls[i] += (float)0.1;
                }
            }
        }
        else
        {    
            for (int i = 0; i < controls.Count; i++)
            {
                controls[i] += 0;
            }
        }
    }
}

【问题讨论】:

    标签: c#


    【解决方案1】:

    您正在将变量的 添加到列表中 - 您并没有添加变量本身。因此,当您更改列表的内容时,根本不会影响变量。举个更简单的例子:

    int x = 10;
    List<int> values = new List<int>();
    values.Add(x); // Add the *current value of x* to the list
    values[0] = 20; // This doesn't change the value of x
    Console.WriteLine(x);
    

    所以你看到的行为绝对是我所期望的。如果不进行更大的更改,就没有简单的方法来实现您想要的行为。您可以编写类似Int32Holder 类的东西,并将AnalogGlitch 变量更改为Int32Holder 类型,然后创建List&lt;Int32Holder&gt; 等...但我怀疑只是硬编码会更简单变量的使用:

    glitch.scanLineJitter = MaybeUpdate(glitch.scanLineJitter);
    glitch.horizontalShake = MaybeUpdate(glitch.horizontalShake);
    glitch.colorDrift = MaybeUpdate(glitch.colorDrift);
    

    或者通过引用方法来传递变量:

    MaybeUpdate(ref glitch.scanLineJitter);
    MaybeUpdate(ref glitch.horizontalShake);
    MaybeUpdate(ref glitch.colorDrift);
    

    【讨论】:

      【解决方案2】:

      您的变量glitch.scanLineJitterglitch.horizontalShakeglitch.colorDriftvalue types,这意味着当您将它们添加到列表中时,您实际上创建了它们所持有值的副本。写作

      controls[i] += (float)0.1;
      

      更改原始变量,它只是更改列表中包含的值,这是原始变量的副本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        • 2011-06-08
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多