如何在Unity3d备用脚本中引用枚举?

时间:2013-03-11 01:31:55

标签: c# android unity3d swipe

我有一个名为TouchDetector.cs的C#脚本,它看起来完全像这样:

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一样。但如果是这样的话,我怎么称呼那些?

3 个答案:

答案 0 :(得分: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; ?
}

答案 1 :(得分:1)

Class(Example.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");
    }
}
}

答案 2 :(得分:0)

枚举允许您创建相关常量的集合。枚举是一种数据类型。它们可以在类的内部或外部创建。如果只有那个类需要访问它,我们会在类中创建一个枚举。如果其他类也需要访问它,我们会在类外创建它。

在这个链接上非常简洁地解释了: https://unity3d.com/learn/tutorials/topics/scripting/enumerations?playlist=17117

您只需将枚举声明移至课堂外即可。现在它在你的班级里面,所以只有那个班级才能访问它。