在球体收缩的同时使对象保持附着在球体表面上

时间:2019-02-08 17:01:17

标签: c# unity3d

我正在尝试制作一个简单的游戏,其中玩家绕球运行,并且必须避开与表面物体的碰撞。为了使游戏更复杂一点,我试图随着时间的推移缩小范围。

我遇到的主要问题是我无法保持球体表面上附着的障碍物(障碍物在表面上生成并旋转,因此障碍物的顶部从球形的中心),同时缩小球形。

这是我的缩小星球代码的样子:

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的方法,但是没有任何效果。即使缩小球体,如何使障碍物附着在球体表面上?注意:障碍物不是球体的子级。

1 个答案:

答案 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压缩^^)

enter image description here


注意

别忘了,每当您要摧毁障碍物时,都必须先将其从列表/词典中删除!

obstacles.Remove(obstacle);
obstacleOffsets.Remove(obstacle);