【问题标题】:How do you compare a position of an object within an array?你如何比较一个对象在数组中的位置?
【发布时间】:2020-03-04 15:03:56
【问题描述】:

所以我试图将数组中对象的位置与我拥有的 int 变量进行比较

我有一个名为 stagePos 的变量,我想用它来找到一个对象,它在数组中的位置具有相同的值

如果 stagePos 为 1,那么我想在数组中找到一个位置为 [1] 的对象,并对其进行处理以及对该数组中的其他对象进行处理,因为它们没有与stagePos相同的值

if(stage[i] != stage[stagePos]){
     Vector3 pos = stage[i].transform.position;
     pos += new Vector3(0f, -4f * Time.deltaTime , 0f);
     stage[i].transform.position = pos;
     stageScript.Invinsible(true);
}
else if(stage[i] == stage[stagePos]){
     Vector3 pos = stage[i].transform.position;
     pos += new Vector3(0f, 4f * Time.deltaTime, 0f);
     stage[i].transform.position = pos;
     stageScript.Invinsible(false);
}

【问题讨论】:

  • stage持有什么类型的对象?
  • if (i ==stagepos) ....
  • stage 拥有一个公共 GameObject[] 舞台;
  • 如果 stagePos 是 int,那么您遇到了什么问题?
  • 如果stagePos是一个Vector3,通过stage.IndexOf(stagePos) 找到它的索引

标签: c# arrays unity3d


【解决方案1】:

我希望代码只是坐在那里等到 stagePos 值发生变化

所以基本上你的代码没有问题,你只是希望它是事件驱动的,而不是使用Update。我们看不到您如何以及在何处更改 stagePos 的值,但我会使用类似的方法

public void SetStagePos(int value)
{
    // ignore if same value
    if(stagePos == value) return;

    stagePos = value;

    for(var i = 0; i < stage.Length; i++)
    {
        // This could be actually done in one line
        stage[i].transform.position += new Vector3(0f,(i == stagePos ? 1 : -1) * 4f * Time.deltaTime , 0f);

        //Note: it is unclear where you want to go with the 
        //stageScript.Invisible()
        // since currently you anyway call it for all objects
        // so this will always end up with the value of
        // stageScript.Invisible(i == stage.Length - 1);
    }
}

你会像这样使用它,例如

private void Update()
{
    if(Input.GetKeyDown(KeyCode.NumPad1))
    {
        SetStagePos(1);
    }
    //etc.
}

或者将stagePos 设为具有支持字段的属性,例如

private int _stagePos;
private int stagePos
{
    get => _stagePos;
    set =>
    {
        _stagePos = value;
        for(var i = 0; i < stage.Length; i++)
        {
            stage[i].transform.position += new Vector3(0f,(i == stagePos? 1 : -1) * 4f * Time.deltaTime , 0f);

            ....
        }
    }
}

现在,每次您为 stagePos 分配一个新值时,都会调用 setter

private void Update()
{
    if(Input.GetKeyDown(KeyCode.NumPad1))
    {
        stagePos = 1;
    }
    //etc.
}

但是请注意,一般而言,您对Time.deltaTime 的使用只有在每帧都调用它的情况下才有意义!

当然还取决于您如何获得未显示的用户输入。

【讨论】:

    猜你喜欢
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多