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中只有一次当游戏开始时,它只发生一次。除此之外,这个想法是什么