Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使这个协同程序像更新函数一样工作_C#_Unity3d - Fatal编程技术网

C# 如何使这个协同程序像更新函数一样工作

C# 如何使这个协同程序像更新函数一样工作,c#,unity3d,C#,Unity3d,基本上,这段代码将游戏对象的大小从大到小再从小到大……(重复) 现在,当游戏运行时,通过将bool repeatable设置为true或false,如果希望它变小变大或变大变小,您将怎么做 比如,在更新函数中,我们有if函数。我希望这种情况发生yield-return-repeaterrp(minScale、maxScale、duration)当鼠标按下时,这种情况发生产生返回RepeatLerp(tramsform.localscale//(对象的当前大小)、minScale、duration

基本上,这段代码将游戏对象的大小从大到小再从小到大……(重复)

现在,当游戏运行时,通过将bool repeatable设置为true或false,如果希望它变小变大或变大变小,您将怎么做

比如,在更新函数中,我们有if函数。我希望这种情况发生
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;
    收益返回空;
    }
    }
    }