C# 如何使这个协同程序像更新函数一样工作
基本上,这段代码将游戏对象的大小从大到小再从小到大……(重复) 现在,当游戏运行时,通过将bool repeatable设置为true或false,如果希望它变小变大或变大变小,您将怎么做 比如,在更新函数中,我们有if函数。我希望这种情况发生C# 如何使这个协同程序像更新函数一样工作,c#,unity3d,C#,Unity3d,基本上,这段代码将游戏对象的大小从大到小再从小到大……(重复) 现在,当游戏运行时,通过将bool repeatable设置为true或false,如果希望它变小变大或变大变小,您将怎么做 比如,在更新函数中,我们有if函数。我希望这种情况发生yield-return-repeaterrp(minScale、maxScale、duration)当鼠标按下时,这种情况发生产生返回RepeatLerp(tramsform.localscale//(对象的当前大小)、minScale、duration
yield-return-repeaterrp(minScale、maxScale、duration)
当鼠标按下时,这种情况发生产生返回RepeatLerp(tramsform.localscale//(对象的当前大小)、minScale、duration)代码>当鼠标向上时
public class TouchMechanic : MonoBehaviour {
Vector3 minScale;
public Vector3 maxScale;
public bool repeatable;
public float speed = 2f;
public float duration = 5f;
public float timeStartedlerping ;
public float z;
IEnumerator Start()
{
minScale = transform.localScale;
while (repeatable)
{
yield return RepeatLerp(minScale, maxScale, duration);
yield return RepeatLerp(maxScale, minScale, duration);
}
}
public IEnumerator RepeatLerp(Vector3 a, Vector3 b, float time)
{
float i = 0.0f;
float rate = (1.0f / time) * speed;
while (i < 1.0f)
{
i += Time.deltaTime * rate;
transform.localScale = Vector3.Lerp(a, b, i);
yield return null;
}
}
}
公共类触控机制:单行为{
向量3分刻度;
公共矢量3最大刻度;
公共布尔可重复;
公共浮动速度=2f;
公共浮动持续时间=5f;
公共浮动时间起始时间;
公共浮动z;
IEnumerator Start()
{
minScale=transform.localScale;
while(可重复)
{
收益回报率RepeatLerp(最小标度、最大标度、持续时间);
收益回报率RepeatLerp(最大标度、最小标度、持续时间);
}
}
公共IEnumerator RepeaterRP(向量3 a、向量3 b、浮点时间)
{
浮点数i=0.0f;
浮动率=(1.0f/次)*速度;
而(i<1.0f)
{
i+=时间增量*速率;
transform.localScale=Vector3.Lerp(a,b,i);
收益返回空;
}
}
}
您似乎希望您的代码能像这样工作:
void Update()
{
if (Input.GetKeyDown("space"))
{
StartExpandContract();
}
}
public class TouchMechanic : MonoBehaviour
{
public Vector3 maxScale;
public float duration = 5f;
void Update()
{
if (Input.GetKeyDown("space"))
{
StartExpandContract();
}
}
public void StartExpandContract()
{
Vector3 minScale = transform.localScale;
StartCoroutine(ExpandContract(minScale, maxScale, duration));
}
IEnumerator ExpandContract(Vector3 minScale, Vector3 maxScale, float duration)
{
float time = 0f;
while(transform.localScale < maxScale) //While the current scale has not reached its max, keep expanding.
{
transform.localScale = Vector3.Lerp(minScale, maxScale, time / duration);
time += time.deltaTime;
yield return null;
}
time = 0f;
while(transform.localScale > minScale) //While the current scale has not yet returned to its original size, keep shrinking.
{
transform.localScale = Vector3.Lerp(maxScale, minScale, time / duration);
time += time.deltaTime;
yield return null;
}
}
}
调用协同程序时,当前比例记录为最小比例
该对象的比例被放大到最大比例
对象的比例将恢复为原始比例
您的代码有点过于复杂。希望这段代码能达到您想要的效果,但可以简化一点
IEnumerator ExpandContract(Vector3 minScale, Vector3 maxScale, float duration)
{
float time = 0f;
while(transform.localScale < maxScale) //While the current scale has not reached its max, keep expanding.
{
transform.localScale = Vector3.Lerp(minScale, maxScale, time / duration);
time += time.deltaTime;
yield return null;
}
time = 0f;
while(transform.localScale > minScale) //While the current scale has not yet returned to its original size, keep shrinking.
{
transform.localScale = Vector3.Lerp(maxScale, minScale, time / duration);
time += time.deltaTime;
yield return null;
}
}
由于该方法未标记为public,因此只能从同一方法中启动协同路由。你可以通过这样的方式暴露它
public void StartExpandContract()
{
Vector3 minScale = transform.localScale;
StartCoroutine(ExpandContract(minScale, maxScale, duration));
}
然后,只要有对TouchMechanical组件的引用,就可以从项目中的任何其他位置调用“StartExpandContract()”方法。或者,您可以添加一个Update()循环,用于检查用户输入并在鼠标或按键上调用“StartExpandContract()”,如下所示:
void Update()
{
if (Input.GetKeyDown("space"))
{
StartExpandContract();
}
}
public class TouchMechanic : MonoBehaviour
{
public Vector3 maxScale;
public float duration = 5f;
void Update()
{
if (Input.GetKeyDown("space"))
{
StartExpandContract();
}
}
public void StartExpandContract()
{
Vector3 minScale = transform.localScale;
StartCoroutine(ExpandContract(minScale, maxScale, duration));
}
IEnumerator ExpandContract(Vector3 minScale, Vector3 maxScale, float duration)
{
float time = 0f;
while(transform.localScale < maxScale) //While the current scale has not reached its max, keep expanding.
{
transform.localScale = Vector3.Lerp(minScale, maxScale, time / duration);
time += time.deltaTime;
yield return null;
}
time = 0f;
while(transform.localScale > minScale) //While the current scale has not yet returned to its original size, keep shrinking.
{
transform.localScale = Vector3.Lerp(maxScale, minScale, time / duration);
time += time.deltaTime;
yield return null;
}
}
}
整个脚本将如下所示:
void Update()
{
if (Input.GetKeyDown("space"))
{
StartExpandContract();
}
}
public class TouchMechanic : MonoBehaviour
{
public Vector3 maxScale;
public float duration = 5f;
void Update()
{
if (Input.GetKeyDown("space"))
{
StartExpandContract();
}
}
public void StartExpandContract()
{
Vector3 minScale = transform.localScale;
StartCoroutine(ExpandContract(minScale, maxScale, duration));
}
IEnumerator ExpandContract(Vector3 minScale, Vector3 maxScale, float duration)
{
float time = 0f;
while(transform.localScale < maxScale) //While the current scale has not reached its max, keep expanding.
{
transform.localScale = Vector3.Lerp(minScale, maxScale, time / duration);
time += time.deltaTime;
yield return null;
}
time = 0f;
while(transform.localScale > minScale) //While the current scale has not yet returned to its original size, keep shrinking.
{
transform.localScale = Vector3.Lerp(maxScale, minScale, time / duration);
time += time.deltaTime;
yield return null;
}
}
}
公共类触控机制:单行为
{
公共矢量3最大刻度;
公共浮动持续时间=5f;
无效更新()
{
if(Input.GetKeyDown(“空格”))
{
StartExpandContract();
}
}
公共无效合同()
{
Vector3 minScale=transform.localScale;
开始例行程序(扩展合同(最小规模、最大规模、持续时间));
}
IEnumerator ExpandContract(Vector3最小刻度、Vector3最大刻度、浮动持续时间)
{
浮动时间=0f;
while(transform.localScaleminScale)//当当前比例尚未恢复到其原始大小时,请继续缩小。
{
transform.localScale=Vector3.Lerp(最大刻度、最小刻度、时间/持续时间);
time+=time.deltaTime;
收益返回空;
}
}
}