缩放脚本:
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视频