【发布时间】:2014-05-20 00:50:49
【问题描述】:
我目前正在开发一个时间系统,在该系统中,我希望能够控制日出开始、白天开始、日落开始和夜晚开始的时间。目前这在系统中是可能的,当“时钟”到达下一个开始时间时,我启动一个协程来开始旋转太阳和月亮。
我的协程是这样的:
IEnumerator RotateSun(Vector3 fDegrees, float SecondsDuringTimeSet)
{
Quaternion quaFromPosition = _lSunLight.transform.rotation;
Quaternion quaToPostion = Quaternion.Euler(fDegrees);
for (float t = 0.0f; t < 1; t += Time.deltaTime / SecondsDuringTimeSet)
{
_lSunLight.transform.rotation = Quaternion.Lerp(quaFromPosition, quaToPostion, t);
yield return null;
}
}
正如你所见,我每次运行它时都会将值传递给它。这样做是这样的:
if (_fCurrGameHour == _fTimeStartSunrise && _bMoveSunAndMoonOnlyOnce == true)
{
// Which TIMESET should it be:
_en_CurrTimeSet = TimeSet.SUNRISE;
// How long should the SUN move and how many which degree should it reach before that time ends
vec3MoveSun = new Vector3(10.0f, 0, 0);
StartCoroutine(RotateSun(vec3MoveSun, _fConvertSunriseToGTSeconds));
// How long should the MOON move and how many which degree should it reach before that time ends
vec3MoveMoon = new Vector3(180.0f, 0, 0);
StartCoroutine(RotateMoon(vec3MoveMoon, _fConvertSunriseToGTSeconds));
// Tell bool that we don't need to move the sun and moon more then once
_bMoveSunAndMoonOnlyOnce = false;
}
正如我写的那样,这个系统目前可以工作。然而,它是一种静态系统。所以目前我需要确保游戏的开始时间是日出时间。否则我的协程会中断,因为它不会在一天开始时间之前旋转到正确的位置。而且我绝对不能在日落时分开始游戏,然后太阳以完全错误的方式旋转,因为那时它更接近以错误的方式旋转(我假设)。
所以我的第一个问题是:我能否以某种方式使系统更具动态性?我希望仍然能够设置日出、白天、日落和夜晚应该开始的时间,因此在不同的季节,例如我可以在一天中有不同的长度。我希望能够在游戏中更改这些时间,然后如果 SUNSET 稍后设置,太阳将开始旋转慢一点,因为它应该需要更长的时间才能到达它的 SUNSET 位置。
关于我的第二个问题:是否也可以重写我的协程,以便我可以在我想要的任何时间开始游戏,并且太阳仍会以正确的角度旋转开始?
太阳总是以相同的旋转(170 度)落下并以相同的旋转(350 度)升起。我只想控制到达这些旋转所需的时间。也许我可以以某种方式将其移至更新阶段,而不是为此使用协程?我不知道如何在我的系统中更改它,所以如果有人有任何想法。请帮忙。
【问题讨论】:
-
现在有人了吗?
-
我尝试了更多想法但没有成功。以前有人做过吗?
标签: unity3d