0

我有一个名为 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 或者我需要对其进行编码。请帮忙。我变得非常沮丧。我查看了枚举,但不太明白我在读什么或如何引用它们。我假设,从我读过的内容来看,枚举就像 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

由于您拥有公开的,您可以enumTouchDetector.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

类(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");
    }
}
}
于 2013-03-11T01:35:48.443 回答
0

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

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

您只需要将您的枚举声明移到您的班级之外。现在它在你的类里面,所以只有那个类可以访问它。

于 2017-04-15T07:58:46.157 回答