我是一名从事课堂项目的新生。在我唯一的场景中,我有1个脚本连接到相机。我希望相机暂停在第一个对象上,滚动到第二个对象并暂停,然后滚动到第三个对象然后暂停然后结束。将此代码放在UPDATE中,相机永远不会停止。在START中,它在大约15秒后犹豫不决,然后它向右移动到最后一个对象,然后函数停止。请注意延迟设置为10秒。我尝试将代码放在函数中并从START调用函数...但没有好处。我究竟做错了什么?帮助我OB1 ....
还有一件事...... START是播放声音的最佳场所吗?
using UnityEngine;
using System.Collections;
// I want the camera to pause over the 1st object, scroll to the 2nd object and pause
// then scroll to the 3rd object and pause then end. Putting this code in the UPDATE
// the camera never stops. Here in the START, it hesitates around 15 sec and then it
// goes right to the last object, then the function stops. Note the delay set for 10
// seconds.
public class CameraControl : MonoBehaviour
{
public float speed; // How fast to move the camera
public int moves; // How many moves to make
public float MyWait; // How long to pause over object
// Use this for initialization
void Start()
{
StartCoroutine(MyDelay());
for (int y = 1; y <= 2; y++) // go to the next two objects
{
for (int i = 1; i <= moves; i++) // Move the camera to the next position
{
Camera.main.transform.Translate(new Vector3(1.0f, 0.0f, 0.0f) * speed * Time.deltaTime);
Debug.LogFormat("moves = {0} ", i);
}
StartCoroutine(MyDelay());
}
}
IEnumerator MyDelay()
{
yield return new WaitForSeconds(10.0f);
}
}
答案 0 :(得分:0)
我认为您需要在Update函数中添加一些代码才能顺利运行。 Time.deltaTime只在Update函数中才有意义,在这里使用它并尝试在Start函数中执行所有操作都不起作用。同时设置Translate变换将立即将位置设置为给定值。查找线性插值(lerp)。
我建议您有一个成员用于跟踪当前状态,即您正在查看的对象,但状态枚举可能更容易阅读。
然后,您可以让成员保留您在该状态的时间,您可以在更新中增加该状态。 然后在更新中,您可以检查是时候更改状态还是更新移动相机。
祝你好运!答案 1 :(得分:0)
尝试将此代码放在相机上,并将您希望相机移动的所有游戏对象移至“对象”列表中。如果您希望相机稍微向后移动以便它可以看到对象,则创建一个新的Vector3,而不是简单地给出确切的位置,然后将新的Vector3赋予迭代对象的x,y和z,然后添加你希望相机与物体保持距离的距离。
public float MyWait = 5; // How long to pause over object
public float speed = 5f; // How fast to move the camera
public List<GameObject> Objects; //List of each object for the camera to go to
void Start()
{
StartCoroutine(MoveToObject(0));
}
IEnumerator MoveToObject(int iteratingObject)
{
//Wait for however many seconds
yield return new WaitForSeconds(MyWait);
bool atDestination = false;
//Move the camera until at destination
while (!atDestination)
{
yield return new WaitForFixedUpdate();
transform.position = Vector3.MoveTowards(transform.position, Objects[iteratingObject].transform.position, Time.deltaTime * speed);
if (transform.position == Objects[iteratingObject].transform.position)
atDestination = true;
}
//Continue iterating until moved over all objects in list
if(iteratingObject != Objects.Count - 1)
StartCoroutine(MoveToObject(iteratingObject + 1));
}