用一个游戏对象来控制其他被随机选中的游戏对象

编程语言 2026-07-10

我想随机让游戏对象去控制其他游戏对象,但我希望每个对象都能控制不止一个。现在,代码会遍历一个游戏对象数组,并随机为它们分配一个要控制的另一个游戏对象。但是就我目前的实现方式,我不确定如何让每个游戏对象都能控制2 个或更多的对象。

下面的代码对于为每个被选中的游戏对象分配一个子对象来说,是完全可行的。

另外,我也不希望我的游戏对象有被同一个游戏对象重复分配两次的可能性,这也是我在努力找出一个合适解决办法的地方。还是我应该把整段提供的代码放进一个循环里,让它重复执行,以达到对象应有的子对象数量?

void AssignChildren ()
{
    pieces = GameObject.FindGameObjectsWithTag("Piece").OrderBy( go => go.name ).ToArray();
    int pieceCount = pieces.Length;
    Debug.Log (pieceCount);

    List<int> usedNumbers = new List<int>();
    int newNumber;
    for (int iter = 0; iter < pieceCount; iter++)
    {
        newNumber = Random.Range (0, pieceCount);
        PieceScript parentToChildComp = pieces [newNumber].GetComponent<PieceScript> ();
        while( usedNumbers.Contains( newNumber ) || newNumber == iter || parentToChildComp.whoDoIControl == iter)//add impossible fix here.
        {
            newNumber = Random.Range( 0, pieceCount);
            parentToChildComp = pieces [newNumber].GetComponent<PieceScript> ();
        }

        PieceScript assignPieceChild = pieces [iter].GetComponent<PieceScript> ();
        assignPieceChild.whoDoIControl = newNumber; // this needs to be edited to an array whoDoIControl[iter] for multiple children I think.
        usedNumbers.Add( newNumber );
    }

    cameraCenter = ((pieces[pieceCount - 1].transform.position - pieces[0].transform.position)) + pieces[0].transform.position;
    transform.position = new Vector3(cameraCenter.x, cameraCenter.y,-10);
}

解决方案

如评论中所建议的,你可以直接:

  1. 将对象打乱顺序
    [ D, A, E, C, B ]
  2. 将它们按你想要的子对象数量分成块,每块再加上一个父对象(在你的情况下是3)
    [ [D, A, E], [C, B] ]
  3. 对于每个块,假设第一项为父对象,剩余的(如有)为子对象

D - A - E C - B

示例代码:

using System.Text;

var gameObjectsAtoZ = Enumerable.Range((int)'A', 26)
                                .Select(character => new GameObject(Encoding.ASCII.GetString([(byte)character])))
                                .ToArray();

AssignChildren(gameObjectsAtoZ, 2);

foreach (var gameObject in gameObjectsAtoZ)
{
    Console.WriteLine(gameObject.Name);

    foreach (var child in gameObject.Children)
    {
        Console.WriteLine($" - {child.Name}");
    }
}


static void AssignChildren(IEnumerable<GameObject> gameObjects, int maximumchildCount)
{
    var shuffledChunkedGameObjects = gameObjects.Shuffle()
                                                .Chunk(1 /*parent*/ + maximumchildCount);

    foreach (var gameObjectChunkOfParentAndChildren in shuffledChunkedGameObjects)
    {
        if (gameObjectChunkOfParentAndChildren is [var parent, .. var children and { Length: > 0 }])
        {
            parent.Children.AddRange(children);
        }
    }
}

record GameObject(string Name)
{
    public List<GameObject> Children { get; } = [];
};

示例输出:

A
 - C
 - L
B
C
D
E
F
 - Q
 - Z
G
H
I
 - U
J
K
 - V
 - J
L
M
 - G
 - W
N
 - D
 - S
O
P
 - O
 - Y
Q
R
 - B
 - H
S
T
 - E
 - X
U
V
W
X
Y
Z
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章