我有一个名为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一样。但如果是这样的话,我怎么称呼那些?
答案 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
您只需将枚举声明移至课堂外即可。现在它在你的班级里面,所以只有那个班级才能访问它。