我正在尝试制作一个简单的游戏,其中玩家绕球运行,并且必须避开与表面物体的碰撞。为了使游戏更复杂一点,我试图随着时间的推移缩小范围。
我遇到的主要问题是我无法保持球体表面上附着的障碍物(障碍物在表面上生成并旋转,因此障碍物的顶部从球形的中心),同时缩小球形。
这是我的缩小星球代码的样子:
void Update()
{
transform.localScale *= 1f - shrinkSpeed * Time.deltaTime;
}
这是我尝试以与球体收缩过程相同的速度向内移动障碍物的代码(该代码也位于update函数内部):
foreach (GameObject obstacle in GameObject.FindGameObjectsWithTag("Obstacle"))
{
Vector3 shrinkDirection = obstacle.transform.position - myTransform.position;
obstacle.transform.Translate(-shrinkDirection * (1f - shrinkSpeed * Time.deltaTime));
}
障碍物飞走了,我还尝试了一些类似使用障碍物的localPosition的方法,但是没有任何效果。即使缩小球体,如何使障碍物附着在球体表面上?注意:障碍物不是球体的子级。
答案 0 :(得分:2)
在生成障碍物之类的东西时,应该存储所有对障碍物的引用
private List<GameObject> obstacles = new List<GameObject>();
// ...
var obst = Instantiate(obstaclePrefab);
// do your translations and rotation etc
obstacles.Add(obst);
比您还可以有一个词典来存储类似的初始相对位置
private Dictionary<GameObject, Vector3> obstacleOffsets = new Dictionary<GameObject, Vector3>();
// ...
obstacleOffsets.Add(obst, obst.transform.position - sphereTranform.position);
比以后您可以使用该偏移量定位障碍物
foreach (GameObject obstacle in obstacles)
{
var originalOffset = obstacleOffsets[obstacle];
obstacle.transform.position = transform.position + MergeVectors(originalOffset, transform.localScale);
}
当然,您也可以只使用Dictionary
之类的
foreach (var kvp in obstacleOffsets)
{
var obstacle = kvp.Key;
var originalOffset = kvp.Value;
obstacle.transform.position = transform.position + MergeVectors(originalOffset, transform.localScale);
}
结果(有趣的GIF压缩^^)
注意
别忘了,每当您要摧毁障碍物时,都必须先将其从列表/词典中删除!
obstacles.Remove(obstacle);
obstacleOffsets.Remove(obstacle);