4

F# を使用して Unity3D を使い始めたばかりで、さまざまな問題を解決するための適切なソリューションとして、書籍やチュートリアルでコルーチンが頻繁に使用されていることに気付きました。F# に同等の組み込み構造があるかどうか、または少なくともそれらを模倣することが可能かどうかを調べようとしましたが、MSDN で何も見つかりません。Continuation モナドを使用したコルーチンの実装に関する記事をいくつか見つけただけですが、これらは初心者の私の頭をはるかに超えています。

Unity ドキュメントの C# の例を次に示します。これは、ゲーム ループ内で繰り返し呼び出されると、時間の経過とともにオブジェクトのアルファ カラーが少しずつフェードします。

IEnumerator Fade() {
    for (float f = 1f; f >= 0; f -= 0.1f) {
        Color c = renderer.material.color;
        c.a = f;
        renderer.material.color = c;
        yield return;
    }

}

したがって、単に IEnumerator を返す関数を宣言してから、"yield" を使用して本体内の必要な場所に制御を移すだけです。「この式は IEnumerator 型を持つことが期待されていましたが、ここには unit 型があります」というエラーが表示され続けるため、F# でこれを行う方法がわかりません。ドキュメントから理解したように、「yield」キーワードは、C# とは異なり、単独では使用できず、シーケンス式内にある必要があるため、F# では動作が異なるようです。

それで、私は何か不足していますか?上記の機能は F# でどのように実装されますか?


アップデート

グスタボの説明は正しい。これは、オブジェクトにアタッチして、10 秒の時間枠で赤の値が 0.1 減少するのを確認できる正確な Unity スクリプトです。

namespace CoroutinesExample
open UnityEngine

type CoroutinesExample() =
    inherit MonoBehaviour()

    member this.Start() =
        // Either of the these two calls will work
        // this.StartCoroutine("Fade") |> ignore
        this.Fade()                       

    member this.Fade() =
       seq { 
           for f in 1.f .. -0.1f .. 0.f do 
               let mutable c = this.renderer.material.color
               c.r <- f 
               this.renderer.material.color <- c
               yield WaitForSeconds(1.f) 
       } :?> IEnumerator

Unityのコルーチンの詳細については、こちらの記事がとても参考になりました。

4

1 に答える 1

7

同等の F# コードは次のとおりです。

member this.Fade() =
    seq {
        for f in 1.0 .. -0.1 .. 0.0 do
            let c = renderer.material.color
            c.alpha <- f
            renderer.material.color <- c
            yield ()
    } :> IEnumerable

C# とは異なり、何らかの値を生成する必要があるため、ユニット ( ()) を使用していることに注意してください。seq式は、 のエイリアスであるタイプを持ちseq<unit>ますIEnumerable<Unit>。Unity が期待するタイプに適合させるには、次を使用してアップキャストする必要があります。:> IEnumerable

于 2013-11-06T11:27:43.107 に答える