只有当对象完成扩展时,我才能开始对话



缩放脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Scaling : UnityEngine.MonoBehaviour
{
    public GameObject objectToScale;
    public GameObject lookAtTarget;
    public float duration = 1f;
    public Vector3 minSize;
    public Vector3 maxSize;
    public bool scaleUp = false;
    public Coroutine scaleCoroutine;
    [HideInInspector]
    public bool scaledFinishedUp = false;
    [HideInInspector]
    public bool scaledFinishedDown = false;
    public void Inits()
    {
        objectToScale.transform.localScale = minSize;
    }
    public IEnumerator scaleOverTime(GameObject targetObj, Vector3 toScale, float duration, Camera objectToScaleCamera)
    {
        float counter = 0;
        Vector3 startScaleSize = targetObj.transform.localScale;
        while (counter < duration)
        {
            counter += Time.deltaTime;
            targetObj.transform.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);
            if (scaleUp)
            {
                var lookPos = lookAtTarget.transform.position - objectToScale.transform.position;
                lookPos.y = 0;
                var rotation = Quaternion.LookRotation(lookPos);
                objectToScale.transform.rotation = Quaternion.Slerp(objectToScale.transform.rotation, rotation, counter / duration);
            }
            else
            {
                var lookPos = lookAtTarget.transform.position - objectToScale.transform.position;
                lookPos.y = 0;
                var rotation = Quaternion.LookRotation(objectToScaleCamera.transform.forward);//SwitchCameras.GetCurrentCamera().transform.forward);//Camera.main.transform.forward);
                objectToScale.transform.rotation = Quaternion.Slerp(objectToScale.transform.rotation, rotation, counter / duration);
            }
            yield return null;
        }
        if(objectToScale.transform.localScale.x >= maxSize.x
            && objectToScale.transform.localScale.y >= maxSize.y
            && objectToScale.transform.localScale.z >= maxSize.z)
        {
            scaledFinishedUp = true;
        }
        if (objectToScale.transform.localScale.x <= maxSize.x
            && objectToScale.transform.localScale.y <= maxSize.y
            && objectToScale.transform.localScale.z <= maxSize.z)
        {
            scaledFinishedDown = true;
        }
    }
    public IEnumerator scaleOverTime(GameObject targetObj, Vector3 toScale, float duration, float rotationSpeed)
    {
        float counter = 0;
        Vector3 startScaleSize = targetObj.transform.localScale;
        while (counter < duration)
        {
            counter += Time.deltaTime;
            targetObj.transform.localScale = Vector3.Lerp(startScaleSize, toScale, counter / duration);
            targetObj.transform.Rotate(Vector3.up * rotationSpeed * Time.deltaTime, Space.Self);
            yield return null;
        }
    }
}

和带有对话的脚本:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class NaviDialogue : MonoBehaviour
{
    public ObjectsManipulation op;
    public bool scale = true;
    public Scaling scaling;
    public ConversationTrigger conversationTrigger;
    private void Start()
    {
        op.canScale = false;
    }
    private void Update()
    {
        if (scaling == true && DOFControl.hasFinished == true)
        {
            DOFControl.hasFinished = false;
            PlayerController.disablePlayerController = true;
            NaviConversations(0);
        }
    }
    public void NaviConversations(int Index)
    {
        scaling.scaleUp = true;
        op.Scaling(false);
        StartCoroutine(conversationTrigger.PlayConversation(Index));
    }
}

在行之后:

op.Scaling(false);

我想检查对象是否已完成扩展,然后启动startcoroutine。问题在于,在更新中,我只调用naviconversations。

然后,当startcoroutine完成时,我想做其他类似的事情:这将使对象缩小:

scaling.scaleUp = false;
op.Scaling(false);

和playconversatio方法最后一堂课:

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEditor;
using UnityEngine;
public class ConversationTrigger : MonoBehaviour
{
    public List<Conversation> conversations = new List<Conversation>();
    public GameObject canvas;
    [HideInInspector]
    public static int conversationIndex;
    public bool conversationEnd = false;
    private bool activateButton = false;
    private DialogueManager dialoguemanager;
    private bool startDialogue = false;
    private void Start()
    {
        conversationIndex = 0;
        dialoguemanager = FindObjectOfType<DialogueManager>();
    }
    public IEnumerator PlayConversation(int index)
    {
        if (conversations.Count > 0 &&
            conversations[index].Dialogues.Count > 0)
        {
            for (int i = 0; i < conversations[index].Dialogues.Count; i++)
            {
                if (dialoguemanager != null)
                {
                    dialoguemanager.StartDialogue(conversations[index].Dialogues[i]);
                }
                while (DialogueManager.dialogueEnded == false)
                {
                    yield return null;
                }
            }
            conversationIndex = index;
            conversationEnd = true;
            canvas.SetActive(false);
            Debug.Log("Conversation Ended");
        }
    }
    public void SaveConversations()
    {
        string jsonTransform = JsonHelper.ToJson(conversations.ToArray(), true);
        File.WriteAllText(@"d:json.txt", jsonTransform);
    }
    public void LoadConversations()
    {
        string jsonTransform = File.ReadAllText(@"d:json.txt");
        conversations.Clear();
        conversations.AddRange(JsonHelper.FromJson<Conversation>(jsonTransform));
    } 
}

我看不到

中发生了什么

conversationTrigger.PlayConversation(Index),但您可以将WaitUntil使用到顶部,以使其等待直到缩放结束。

之类的东西
yield return new WaitUntil(scalingIsDoneCondition);

其中 scalingIsDoneCondition是检查缩放是否完成的检查。一旦返回true,Coroutine就会继续。


另外,您可以拥有一个额外的ienumerator,然后等待着例如。

public void NaviConversations(int Index)
{
    scaling.scaleUp = true;
    op.Scaling(false);
    StartCoroutine(StartConversationAfterScaling(Index));
}
private IEnumerator StartConversationAfterScaling(int index)
{
    yield return new WaitUntil(scalingIsDoneCondition);
    StartCoroutine(conversationTrigger.PlayConversation(Index));
}

如果您需要从同一类中检查条件。


另一种形式是使整个缩放率而不是 public IEnumerator,并从另一个形式产生

public void NaviConversations(int Index)
{
    scaling.scaleUp = true;
    StartCoroutine(StartConversationAfterScaling(Index));
}
private IEnumerator StartConversationAfterScaling(int index)
{
    yield return op.Scaling(false);
    StartCoroutine(conversationTrigger.PlayConversation(Index));
}

这将需要使op.Scaling也是IEnumerator

我什至没有阅读您的全部脚本。强烈建议您使用补间库作为此类内容。您可以轻松地缩放,旋转,翻译,将颜色与这些库相混合,并混合颜色。看一下点之间,与介于之间,您可以像这样编写缩放:

transform.DoScale(Vector3.one * 2, 1f).onCompelete( ()=>
    {
        print("Scaling finished!");
    }

,但是互惠并不是全部设置回调,而有补间,您可以通过编程对象进行动画化。

您可以检查有关功能的快速教程:YouTube视频

最新更新