C# 如何缓慢添加到按钮上的对象Z比例

C# 如何缓慢添加到按钮上的对象Z比例,c#,unity3d,transform,C#,Unity3d,Transform,我想做一个游戏,你开一辆小车,当你按下一个按钮,比如说C,翅膀就会飞出来。我在想最好的办法是把一个胶囊缩放成汽车小孩的圆形翅膀。这些机翼的Z比例通常很小,以至于你看不到它们(0.01),但是当你按C键时,Z值会慢慢增加,直到达到某个点(在我的例子中是0.0435)。我现在得到的只是一个错误,说“不能修改‘Transform.localScale’的返回值,因为它不是一个变量。” 您的错误是您使用了1等号,但您需要2等号进行比较,例如=: if (wings.localScale.z == 0.0

我想做一个游戏,你开一辆小车,当你按下一个按钮,比如说C,翅膀就会飞出来。我在想最好的办法是把一个胶囊缩放成汽车小孩的圆形翅膀。这些机翼的Z比例通常很小,以至于你看不到它们(0.01),但是当你按C键时,Z值会慢慢增加,直到达到某个点(在我的例子中是0.0435)。我现在得到的只是一个错误,说“不能修改‘Transform.localScale’的返回值,因为它不是一个变量。”


您的错误是您使用了1等号,但您需要2等号进行比较,例如
=

if (wings.localScale.z == 0.01f) { /* ... */ } // you want to compare
该错误具有误导性,当您使用一个等号赋值时,该错误是因为
localScale
是一个结构,您必须从中引入一个局部变量,更改其值,然后将其赋回
localScale

var localScale = wings.localScale;
localScale.z = 0.01f;
wings.localScale = localScale;
回到你的问题,你会得到一个关于浮点比较的警告

下面是比较它们的更好方法:

if (Mathf.Approximately(wings.localScale.z, 0.01f))
{
    // ...       
}

编辑

调整你的翅膀,根据你的需要改变:

using UnityEngine;

public class Scaler : MonoBehaviour
{
    public Transform[] Wings;                                              // drag your wings here in inspector
    public KeyCode     WingScaleKeyUp     = KeyCode.KeypadPlus;            // scale up key
    public KeyCode     WingScaleKeyUpDown = KeyCode.KeypadMinus;           // scale down key
    public Vector3     WingScaleFactor    = new Vector3(0.1f, 0.1f, 0.1f); // scale step
    public Vector3     WingScaleSpeed     = new Vector3(0.1f, 0.1f, 0.1f); // scale speed
    public Vector3     WingScaleMin       = new Vector3(0.1f, 0.1f, 0.1f); // scale min
    public Vector3     WingScaleMax       = new Vector3(2.0f, 2.0f, 2.0f); // scale max

    private void Update()
    {
        if (Wings == null)
            return;

        foreach (var target in Wings)
        {
            var p = Input.GetKey(WingScaleKeyUp) ? +1.0f : Input.GetKey(WingScaleKeyUpDown) ? -1.0f : 0.0f;
            var q = target.localScale;
            var r = Vector3.Scale(WingScaleFactor, WingScaleSpeed * p); // scale axes independently
            var s = q + r;
            var x = Mathf.Max(WingScaleMin.x, Mathf.Min(WingScaleMax.x, s.x)); // restrict
            var y = Mathf.Max(WingScaleMin.y, Mathf.Min(WingScaleMax.y, s.y));
            var z = Mathf.Max(WingScaleMin.z, Mathf.Min(WingScaleMax.z, s.z));

            target.localScale = new Vector3(x, y, z);
        }
    }
}

看看这是否有效:

Vector3 tempScale = wings.localScale;
tempScale.z += 0.0335f;
wings.localScale = tempScale;

真是太棒了!我用你的建议修正了if声明,然后使用Easwar Chinraj的想法进行更改。我复制了Easwar Chinraj建议的3行,并将+=更改为-=,但它只更改了一次大小,从0.01更改为0.0435,或从0.0435更改为0.01。我怎样才能使它在我按下按钮时变为下一个尺寸,而不是一次?对不起,让我澄清一下:我希望能够按下C一次,尺寸会发生变化,这取决于它之前的位置。如果它在0.0435,我按C,它会变为0.01。如果它在0.01,我按C,它会变为0.0435,而我不必按住键。也许只是检查一下,如果大小是0.01,我按c键,它会变为0.0435,反之亦然?我不知道该怎么做,我对这个lol太初学了。你可以使用类似
Mathf.movetoward
的东西。
Vector3 tempScale = wings.localScale;
tempScale.z += 0.0335f;
wings.localScale = tempScale;