Подход заключается в создании сценария для блока, подобного приведенному ниже, содержащему.
- Индекс количества токенов, присутствующих на нем, и
- Массив позиций vector2 (рассмотрим матрицу 3 * 3)
- И расстояние от центра до кратного с позициями.
Таким образом, при добавлении токена в куб вам нужно будет пройти позицию плиток куба (это будет центр плитки куба, поэтому я назвал ее кубическим центром) и токен, который нужно добавить.
сначала проверьте, равен ли индекс -1, то есть токенов нет, поэтому поместите токен в центр (cubeCenter) и увеличьте индекс до 0.
еще
измените позицию предыдущего токена на pos [index] * distanceFromCubeCenter + cubeCenter, увеличьте индекс и установите для позиции нового токена значение cubeCenter.
Рассмотрим, если плитка куба находится в точке (3,0,3), и в центре уже есть токен, поэтому индекс будет равен 0. Если появится другой токен, то позиция старого токена будет (- 1 * 0.3 + 3,0, -1 * 0.3 + 3) = (2.7,0,2.7) и поместит токен, как внизу слева на вашем изображении, и новый токен будет в центре. Точно так же, если появится другой токен, токен в центре перейдет в (3,0,2,7), как нижний центр вашего изображения.
3 * 3 матрицы, но в этом случае используются только 5 позиций.
| (-1,0,1) |(0,0,1) |(1,0,1) |
| (-1,0,0) |(0,0,0) |(1,0,0) |
| (-1,0,-1)|(0,0,-1)|(1,0,-1)|
код в 3d, так как я видел синюю ось z, вам придется изменить его в зависимости от того, как вы храните / перемещаете токены.
int index = -1;
public Vector3[] pos; //(-1,0,-1),(0,0,-1),(1,,0,0),(-1,,0,1),(0,0,1)
public float distanceFromCubeCenter = 0.3f; // spacing from the center of the cube
public void AddToCube(Vector3 cubeCenter,GameObject token)
{
if (index == -1) //only for the first token on cube
{
token.transform.position = cubeCenter;
index++; // increment index to 0
}
else
{
previousTokenOnThisCube.transform.position = pos[index] * distanceFromCubeCenter + cubeCenter;
index++;
token.transform.position = cubeCenter;
}
}