如何让相机暂停x轴上的3个物体?

时间:2016-11-19 09:21:09

标签: c# unity3d mono

我是一名从事课堂项目的新生。在我唯一的场景中,我有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);
    }

}

2 个答案:

答案 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));
}