C# 仅当对象已完成缩放时,如何启动对话?

C# 仅当对象已完成缩放时,如何启动对话?,c#,unity3d,C#,Unity3d,缩放脚本: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Scaling : UnityEngine.MonoBehaviour { public GameObject objectToScale; public GameObject lookAtTarget; public float duration = 1f; publ

缩放脚本:

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;
        }
    }
}
排队后:

op.Scaling(false);
我想检查对象是否已完成放大,然后启动StartCode例程。问题是在更新中我只打了一次电话给NaviConversations

然后,当Start例程完成后,我想做其他类似的事情:这将缩小对象的比例:

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));
    } 
}
使用系统;
使用系统集合;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
使用UnityEditor;
使用UnityEngine;
公共类会话触发器:单一行为
{
公共列表对话=新列表();
公共游戏对象画布;
[hideininstecpt]
公共静态int会话索引;
public bool conversationEnd=false;
私有布尔激活按钮=假;
专用对话框管理器对话框管理器;
私有布尔startDialogue=假;
私有void Start()
{
会话索引=0;
dialoguemanager=FindObjectOfType();
}
公共IEnumerator播放会话(int索引)
{
如果(conversations.Count>0&&
对话[index].dialogs.Count>0)
{
对于(int i=0;i
我看不出发生了什么

conversationTrigger.PlayConversation(Index)
但是您可以使用到它的顶部,以便让它等待缩放结束

差不多

yield return new WaitUntil(scalingIsDoneCondition);
其中,
scalingIsDoneCondition
是检查缩放是否已完成。当它返回
true
时,协同程序将继续


或者,您可以使用额外的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));
}
如果需要检查同一类中的条件


另一种形式是使整个缩放成为一个
公共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

我看不出在

conversationTrigger.PlayConversation(Index)
但是您可以使用到它的顶部,以便让它等待缩放结束

差不多

yield return new WaitUntil(scalingIsDoneCondition);
其中,
scalingIsDoneCondition
是检查缩放是否已完成。当它返回
true
时,协同程序将继续


或者,您可以使用额外的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));
}
如果需要检查同一类中的条件


另一种形式是使整个缩放成为一个
公共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

我甚至没有阅读您的全部脚本。强烈建议您使用tweening库来存储这些内容。使用这些库,您可以轻松缩放、旋转、平移、混合颜色等。 看一看,使用DoTween,您可以这样编写缩放:

transform.DoScale(Vector3.one*2,1f).onComplete(()=>
{
打印(“缩放完成!”);
}
但是tween并不仅仅是设置回调,使用tween可以通过编程方式设置对象的动画

您可以查看有关功能的快速教程:

我甚至没有阅读你的全部脚本。强烈建议你使用tweening库来处理这些内容。你可以使用这些库轻松地缩放、旋转、翻译、混合颜色等。 看一看,使用DoTween,您可以这样编写缩放:

transform.DoScale(Vector3.one*2,1f).onComplete(()=>
{
打印(“缩放完成!”);
}
但是tween并不仅仅是设置回调,使用tween可以通过编程方式设置对象的动画

您可以查看有关功能的快速教程:

带有DOFControl.hasFinished的部分在游戏中只出现一次,因为它只在游戏开始时出现一次。另外,我想做的是在NaviDialouge脚本中,每次都可以轻松启动来自其他脚本的另一个对话。在我的游戏中,当对话开始时,让对象在sc时放大当对话结束时,aling up已完成启动对话缩小对象。这有点复杂,因为op脚本使用缩放脚本。只是当从op脚本向上/向下缩放时,它还使用其他元素,如灯光和其他东西,这就是为什么我从op而不是从s调用缩放caling.我所做的对话系统是使用indexs。我知道如果我可以上传项目的某个部分,会有很多代码。但是想法是,当与navi对话时,navi应该放大对话,然后开始对话,最后缩小。带有DOFControl.hasFinished的部分在游戏sinc中只有一次当游戏开始时,它只发生一次。除此之外,这个想法是什么