0

次のような TouchDetector.cs というタイトルの C# スクリプトが 1 つあります。

using UnityEngine;
using System.Collections;

public class TouchDetector : MonoBehaviour
{
  public delegate void deTouchEvent (enTouchType touchType);

  public static event deTouchEvent evTouchEvent;

  public enum enTouchType
  {
    SwipeLeft,
    SwipeRight,
    SwipeDown,
    SwipeUp,
  }   

  void Start ()
  {   
  }   

  void Update ()
  {   
    if (evTouchEvent == null)
        return;

    if (Input.GetKeyDown(KeyCode.UpArrow   )) evTouchEvent(enTouchType.SwipeUp   );
    if (Input.GetKeyDown(KeyCode.DownArrow )) evTouchEvent(enTouchType.SwipeDown );
    if (Input.GetKeyDown(KeyCode.LeftArrow )) evTouchEvent(enTouchType.SwipeLeft );
    if (Input.GetKeyDown(KeyCode.RightArrow)) evTouchEvent(enTouchType.SwipeRight);

    if (Input.touchCount > 0)
    {
        foreach (Touch t in Input.touches)
        {
            Vector3 swipe = t.deltaPosition * t.deltaTime;

            if (swipe.y >  0.5f) evTouchEvent(enTouchType.SwipeUp   );
            if (swipe.y < -0.5f) evTouchEvent(enTouchType.SwipeDown );
            if (swipe.x >  0.5f) evTouchEvent(enTouchType.SwipeRight);
            if (swipe.x < -0.5f) evTouchEvent(enTouchType.SwipeLeft );
        }
    }
}
}   

次のキーコード呼び出しを、上記の対応するスワイプ呼び出しに置き換えようとしています。私はプログラミングに少し慣れていないので、ここで独学しようとしています。私はなんとかスワイプスクリプトを機能させることができましたが、それが理にかなっている場合、これをコントローラーとして取得する方法まで、あらゆる手段を使い果たしました。あなたが私に与えることができる助けやアドバイスをありがとう. 私は次のことを試しました。

if(SwipeLeft)
{
  //Do something here
}

しかし、これは私にとってはうまくいきません。他の制御スクリプト内で制御タイプを参照できないようです。置き換えようとしている Control.cs スクリプトのスクリプトは次のようになります。

if (Input.GetKeyDown(KeyCode.LeftArrow) && m_playerJump <= -1.0f && m_playerSlide <=0.0f)
{
  if (m_playerDirection == enCellDir.North) m_playerNextDirection = enCellDir.West;
  if (m_playerDirection == enCellDir.East ) m_playerNextDirection = enCellDir.North;
  if (m_playerDirection == enCellDir.South) m_playerNextDirection = enCellDir.East;
  if (m_playerDirection == enCellDir.West ) m_playerNextDirection = enCellDir.South;
}

Input.GetKeyDown の代わりに、SwipeLeft と言うか、コーディングする必要があります。助けてください。私はとてもイライラしています。列挙型を調べましたが、何を読んでいるのか、またはそれらを参照する方法がよくわかりません。私が読んだことから、enumはJavaのintに似ていると思います。しかし、もしそうなら、私はそれらをどのように呼びますか?

4

3 に答える 3

4

enum キーワードは、列挙子リストと呼ばれる一連の名前付き定数で構成される特殊な型である列挙型を宣言するために使用されます。すべての列挙型には基になる型があり、char 以外の任意の整数型にすることができます。列挙要素のデフォルトの基になる型は int です。デフォルトでは、最初の列挙子の値は 0 で、後続の各列挙子の値は 1 ずつ増加します。

これは基本的に、もののリストを持つことができ、リスト内の位置に基づいてそれらのものを呼び出すことができることを意味します。例えば:

enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

この列挙では、Sat は 0、Sun は 1、Mon は 2 などです。タイプの変数にDaysは、基になるタイプの範囲内の任意の値を割り当てることができます。値は名前付き定数に限定されません。

// keyword_enum.cs
// enum initialization:
using System;
public class EnumTest 
{
    enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

    static void Main() 
    {
        int x = (int)Days.Sun;
        int y = (int)Days.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}

次の出力が得られます。

Sun = 1
Fri = 6

enumを公​​開しているためTouchDetector.cs、このクラスを参照する他のクラスで使用できます。それらの呼び出しは、通常、Switchステートメントを介して行われます。

例えば:

public enum Color
{
    Red,
    Blue,
    Green
}

class Program
{
    static void Main(string[] args)
    {
        Color color = Color.Red;

        switch (color)
        {
            case Color.Red:
                break;

            case Color.Blue:
                break;

            case Color.Green:
                break;
        }
    }
}

を使用caseすると、そのようなことが呼び出されたときに何をするかを宣言できます。壊す代わりに、そこにメソッドを挿入することができますdoSomethingWithRed()

あなたの場合、次のようなことを言っている可能性があります。

var movingLeft = false;

case enTouchType.SwipeLeft:
    movingLeft = true;

そして、変更しようとしているスクリプトで、次を試してください。

if (movingLeft && m_playerJump <= -1.0f && m_playerSlide <=0.0f)
{
  if (m_playerDirection == enCellDir.North) m_playerNextDirection = enCellDir.West;
  if (m_playerDirection == enCellDir.East ) m_playerNextDirection = enCellDir.North;
  if (m_playerDirection == enCellDir.South) m_playerNextDirection = enCellDir.East;
  if (m_playerDirection == enCellDir.West ) m_playerNextDirection = enCellDir.South;
  //movingLeft = false; ?
}
于 2013-03-11T10:49:06.113 に答える
1

クラス (例.cs):

public enum enTouchType{ one, two};
public class Example {
    public enum enTouchType { one, two };
}

使用法 (SomeOther.cs):

void Foo(){
    enTouchType outer = enTouchType.one;
    Example.enTouchType inner = Example.enTouchType.one;

    switch(outer){
        case enTouchType.one:
            Console.WriteLine("outer.one");
            break;
    }
    switch(inner){
        case  Example.enTouchType.one:
            Console.WriteLine("inner.one");
            break;        
    }
}

[若干の明確化アップデート]

列挙型は単なるデータ型であるため、次のようになります。

//(1) This won't work:
void evTouchEventExample(TouchDetector.enTouchType tt){
    if(SwipeLeft){}
}
//(2) Do something like:
void evTouchEventExample(TouchDetector.enTouchType tt){
    if(tt==TouchDetector.enTouchType.SwipeLeft){}
    //or use a switch statement, whatever.
}

最初の例で指摘したのは、ネストされた列挙型を別のクラスで使用するには、クラス名 TouchDetector.enTouchType を含める必要があるということだけです。evTouchEvent のデリゲート参照メソッドは (2) のようになります。

完全な例:

public class EnumTest : MonoBehaviour {
public delegate void deTouchEvent (enTouchType t);
public static event deTouchEvent  evTouchEvent;
public enum enTouchType { SwipeLeft, SwipeRight }

void Start () {
            // setup and do evt
    evTouchEvent += DummyTest.DummyDel;
    evTouchEvent(enTouchType.SwipeLeft);    
}
}
public class DummyTest {
public static void DummyDel(EnumTest.enTouchType t){
    if(t==EnumTest.enTouchType.SwipeLeft){
        Debug.Log("swipey_left");
    }
    else if(t==EnumTest.enTouchType.SwipeRight){
        Debug.Log("swipey_right");
    }
}
}
于 2013-03-11T01:35:48.443 に答える
0

列挙を使用すると、関連する定数のコレクションを作成できます。列挙はデータ型です。それらは、クラスの内外で作成できます。そのクラスだけがそれにアクセスする必要がある場合は、クラス内に列挙型を作成します。他のクラスもアクセスする必要がある場合は、クラスの外に作成します。

このリンクで非常に簡潔に説明されています: https://unity3d.com/learn/tutorials/topics/scripting/enumerations?playlist=17117

enum 宣言をクラスの外に移動するだけです。現在、それはクラス内にあるため、そのクラスのみがアクセスできます。

于 2017-04-15T07:58:46.157 に答える