unity数组,获取当前索引-x或+x

Unity array, get current index -x or +x

例如,如何获得当前索引 -5。我知道如何获取当前索引并且我可以减去或添加到该索引,但这会导致数组越界错误。假设数组有 15 个项目(索引 0/14),我当前的索引是 2,如果我减去 5,它将 return -3。而这在数组中不存在。现在我想要的是当索引为 2 并且我减去 5 时 returns 11,所以它应该始终循环遍历数组。显然,加 5 也是如此。

您可以像这样创建一个扩展方法:

public static int ComputeCircularIndex(this Array arr, int i) 
{
   int N = arr.GetLength(0);
   if (i < 0) 
   {
       i = N + (i % N);
   } 
   else 
   {
       i = i % N;
   }
   return i;
}

随着 modulo operator you can achieve the secondo behavior (increment the index and cycle throw an array) pretty easily. For the first behavior, you need some additional logic. Here's the fiddle.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MyClass: MonoBehaviour
{
   private int currentIndex = 0;

   void Increment(int value)
   {
      currentIndex += value;
      currentIndex = currentIndex % 15;
   }

   void Decrement(int value)
   {
      currentIndex -= value;

      if (currentIndex < 0)
          currentIndex = 15 + (currentIndex % 15);
   }
}

您可以使用以下代码来确保索引在范围内。 它将添加数组的长度,因此负数将在范围内。 如果索引是正的、正确的,这样的添加将导致索引超出范围,因此我使用 mod % 运算符,再次确保我们在范围内。

var numbers = Enumerable.Range(0, 15).ToArray();
var idx = 2;
var offset = 5;
idx = (idx - offset + numbers.Length) % numbers.Length;
var el = numbers[idx];

el 等于 12.

为了确保正确处理 offset 的大值,您可以使用 numbers.Length 的任意倍数,例如

idx = (idx - offset + 100 * numbers.Length) % numbers.Length;