
前提・実現したいこと
以前の質問でActionを使うことをご教示いただき、UnityActionを使って、
コールバッグコールバックする方法を実装しているのですが、UnityActionの書き方が間違っているらしく、エラーが出てしまいます。
解決方法のご教示をお願い致します。
試したこと
Mathf.Lerpで取得した値を毎回コールバックさせて、cubeのtransfrom.postion.xに反映させることを試みています。
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.Events; 5 6public class Sample : MonoBehaviour { 7 8 [SerializeField] 9 GameObject cube; 10 11 void Start () { 12 StartCoroutine(ChangeCoroutine(UnityAction=>{cube.transform.position = new Vector3(x, cube.transform.position.y, cube.transform.position.z)}, 1f, 5f, 3f)); 13 } 14 15 IEnumerator ChangeCoroutine(UnityAction<float> action, float start, float end, float duration){ 16 17 float t = 0; 18 float x = 0; 19 20 while(t < 1){ 21 x = Mathf.Lerp(start, end, t); 22 t += Time.deltaTime/duration; 23 action(x); 24 yield return null; 25 } 26 27 //Mathf.Lerpに渡されるときのtが1未満でwhile文から抜ける為、調整。 28 x = end; 29 action(x); 30 } 31} 32
発生している問題・エラーメッセージ
「UnityAction=>{cube.transform.position = new Vector3(x, ~」のxに赤の下線がついていて、エラー箇所はこちらです。
error CS1002: ; expected
続いて発生しているエラーメッセージ
error CS0103: The name `x' does not exist in the current context
ご回答を受けて。
void Start () { StartCoroutine(ChangeCoroutine(cube.transform.position.x, 5f, 3f, (posx)=>{cube.transform.position = new Vector3(posx, cube.transform.position.y, cube.transform.position.z);} )); } IEnumerator ChangeCoroutine(float start, float end, float duration, UnityAction<float> action){ float t = 0; float x = 0; while(t < 1){ x = Mathf.Lerp(start, end, t); t += Time.deltaTime/duration; action(x); yield return null; } //Mathf.Lerpに渡されるときのtが1未満でwhile文から抜ける為、調整。 x = end; action(x); }
分ける場合。
void Start () { StartCoroutine(ChangeCoroutine(1f, 5f, 3f, MyAction)); } void MyAction(float posx){ cube.transform.position = new Vector3(posx, cube.transform.position.y, cube.transform.position.z); } IEnumerator ChangeCoroutine(float start, float end, float duration, UnityAction<float> action){ float t = 0; float x = 0; while(t < 1){ x = Mathf.Lerp(start, end, t); t += Time.deltaTime/duration; action(x); yield return null; } //Mathf.Lerpに渡されるときのtが1未満でwhile文から抜ける為、調整。 x = end; action(x); }
UnityActionで何でジェネリックが必要なのか自分なりの解釈。
namespace UnityEngine.Events { public delegate void UnityAction(); public delegate void UnityAction<T0>( T0 arg0 ); public delegate void UnityAction<T0, T1>( T0 arg0, T1 arg1 ); public delegate void UnityAction<T0, T1, T2>( T0 arg0, T1 arg1, T2 arg2 ); public delegate void UnityAction<T0, T1, T2, T3>( T0 arg0, T1 arg1, T2 arg2, T3 arg3 ); }
疑問だった点、「UnityAction<T0>( T0 arg0 );」じゃなくて、「UnityAction(T0 arg0 );」でもいいのでは?という疑問がありました。
しかし、UnityActionは、呼び出すときにUnityAction(値)の形で呼び出すので、呼び出し時には、引数の型を設定できない。
UnityAction型を宣言をするときに、UnityAction<float>のようにジェネリックに型を指定して、そのUnityActionの引数が何の型を扱うものなのか指定している。上記のようにUnityActionは宣言されているので、UnityActionのジェネリックの型指定の数が、引数の数と一致するようになっている。
UnityAction<T0>の型宣言をした場合、UnityAction<T0>(T0 arg0)を使用することになる。 UnityAction<T0, T1>の型宣言をした場合、UnityAction<T0, T1>( T0 arg0, T1 arg1 )を使用することになる。 UnityAction<T0, T1, T2>の型宣言をした場合、UnityAction<T0, T1, T2>( T0 arg0, T1 arg1, T2 arg2 )を使用することになる。 UnityAction<T0, T1, T2, T3>も同様。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/19 14:16