【问题标题】:Make objects stay attached to sphere's surface while the sphere is shrinking使物体在球体收缩时保持附着在球体表面
【发布时间】:2019-02-09 01:58:42
【问题描述】:

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

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

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

void Update()
{
    transform.localScale *= 1f - shrinkSpeed * Time.deltaTime;
}

这是我试图以与球体收缩过程相同的速度向内移动障碍物的代码(此代码也在更新函数中):

foreach (GameObject obstacle in GameObject.FindGameObjectsWithTag("Obstacle"))
{
    Vector3 shrinkDirection = obstacle.transform.position - myTransform.position;
    obstacle.transform.Translate(-shrinkDirection * (1f - shrinkSpeed * Time.deltaTime));
}

障碍物刚刚飞走,我也尝试了几种方法,例如使用障碍物的 localPosition,但没有任何效果。即使在缩小球体的同时,如何使障碍物附着在球体的表面上?注意:障碍物不是球体的孩子。

【问题讨论】:

  • 障碍物是球体的子对象还是独立的游戏对象?
  • @derHugo 它们是独立的游戏对象。文章末尾是这么写的
  • 哦,好吧,我明白了……障碍本身不应该缩小吧?

标签: c# unity3d


【解决方案1】:

您应该在生成障碍物时存储对障碍物的所有引用,例如

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 like

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);

【讨论】:

  • 如果我不希望我的障碍也缩小,我该如何使用它?
  • 是的,刚刚明白你的问题^^
  • 谢谢!这太棒了!
  • @EnriqueTorres 很高兴为您提供帮助!很抱歉事先造成混乱;)
  • 别担心!你付出的努力太棒了!当有人这么好的回答您的问题时,我们总是很感激! :)
猜你喜欢
  • 1970-01-01
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
  • 2016-01-18
  • 1970-01-01
相关资源
最近更新 更多