我不使用统一,但我认为这个问题不是统一/c# 特定的。
考虑到您想要放置的每个行星都“依赖”于父级,您可以实施它,以某种方式,太阳被排除并放置在原点。
所以说,太阳它位于(0,0,0),Planet1 属于太阳并且它位于一定的半径距离,所以它有自己的半径和旋转角度(总是与它的父级相关)。行星 2 可能有太阳作为父母,所以它是一颗“行星”,或者来自行星 1,成为它的月亮。等等...
使用这个简单的方案,您总是需要管理 4 个可以轻松实现为类的东西,即(未经测试,我在这里没有编译器就编写了它,检查可能的语法错误):
public class Planet
{
public Planet Parent; //if null, I'm the first in chain
public float OrbitRadius; //From my parent
public float OrbitAngle; //0-360 around my parent
public float Radius; //Planet size
//EDIT:
public Vector3 Position;
public void CalculatePosition()
{
if(Parent == null) this.Position = new Vector(0, 0, 0);
this.Position = Parent.Position + OrbitRadius + Math.Sin(OrbitAngle * Math.PI / 180.0f); //Check if it has to be done for each vector component
}
}
此外,您可以轻松实现太阳、行星、卫星、卫星的卫星 :-)
每次创建行星时,都会分配其父级,随机化类值,仅关注 OrbitRadius >> Radius(>> 我的意思是真的“真的更大”,而不仅仅是“更大”)
这也应该给你一个最强的“行星链”来处理,也许是递归函数。
作为最后一步,您可以“渲染”他们在整个链条中的位置,以增量方式将 PlanetX 位置添加到父位置,仅处理 OrbitAngle;你在这里需要一些正弦/余弦数学,但你不会因为比例因子而松懈。
希望这可以帮助
编辑:我添加了一种CalculatePosition,现在无法验证,它只是为了澄清概念并且肯定可以改进。