C# 如何将枚举与Vector3轴一起使用?
在生产线上:C# 如何将枚举与Vector3轴一起使用?,c#,unity3d,C#,Unity3d,在生产线上: using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate : MonoBehaviour { enum Axistorotate { Back, Down, Forward, Left, Right, Up, Zero}; public float angle; public float speed; pub
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Rotate : MonoBehaviour
{
enum Axistorotate { Back, Down, Forward, Left, Right, Up, Zero};
public float angle;
public float speed;
public Vector3 axis;
private bool stopRotation = true;
private Axistorotate myAxis;
// Start is called before the first frame update
void Start()
{
myAxis = Axistorotate.Left;
StartCoroutine(RotateObject());
}
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.S))
{
stopRotation = false;
}
if (Input.GetKeyDown(KeyCode.C))
{
stopRotation = true;
StartCoroutine(RotateObject());
}
}
IEnumerator RotateObject()
{
while (stopRotation == true)
{
transform.Rotate(Axistorotate.Left, angle);
yield return new WaitForSeconds(speed);
}
}
}
我想使用枚举或制作一些我可以在Vector3.Left或Vector3.Right…和所有轴之间选择的东西,简称为enum
我们的想法是能够在这一行中使用枚举或矢量3轴,而不是在多行中使用。可能最简单的方法是使用
vector3
常量并将它们分配给vector3
变量。但是,有时您希望使用类型安全性来确保您的方法不会收到意外的轴或Vector3.zero
您不能仅使用enum
(您需要一个开关或数组或其他东西来将enum
解释为Vector3
),但您可以使用带有私有构造函数的类、一些只读字段、,以及公共静态隐式运算符Vector3
方法:
transform.Rotate(Axistorotate.Left, angle);
如何使用的示例:
public class RotationAxis
{
public static readonly AxisVector right = new Axis(Vector3.right);
public static readonly AxisVector left = new Axis(Vector3.left);
public static readonly AxisVector up = new Axis(Vector3.up);
public static readonly AxisVector down = new Axis(Vector3.down);
public static readonly AxisVector forward = new Axis(Vector3.forward);
public static readonly AxisVector back = new Axis(Vector3.back);
private Vector3 _value;
private RotationAxis(Vector3 axis)
{
this._value = axis;
}
public static implicit operator Vector3(RotationAxis axis)
{
return axis._value;
}
}
使用
Vector3
常量并将它们分配给Vector3
变量可能是最简单的方法。但是,有时您希望使用类型安全性来确保您的方法不会收到意外的轴或Vector3.zero
您不能仅使用enum
(您需要一个开关或数组或其他东西来将enum
解释为Vector3
),但您可以使用带有私有构造函数的类、一些只读字段、,以及公共静态隐式运算符Vector3
方法:
transform.Rotate(Axistorotate.Left, angle);
如何使用的示例:
public class RotationAxis
{
public static readonly AxisVector right = new Axis(Vector3.right);
public static readonly AxisVector left = new Axis(Vector3.left);
public static readonly AxisVector up = new Axis(Vector3.up);
public static readonly AxisVector down = new Axis(Vector3.down);
public static readonly AxisVector forward = new Axis(Vector3.forward);
public static readonly AxisVector back = new Axis(Vector3.back);
private Vector3 _value;
private RotationAxis(Vector3 axis)
{
this._value = axis;
}
public static implicit operator Vector3(RotationAxis axis)
{
return axis._value;
}
}
实际上,您可以使用enum来完成这项工作,就像您所希望的那样。你可以这样做:
public void RotateMe(RotationAxis axis, float angle) {
// using axis as a Vector3 guaranteed by type safety to be one of:
// Vector3.right/left/up/down/forward/back
// RotationAxis implicitly converts to Vector3
transform.Rotate(axis, angle);
// you can also just use RotationAxis._ as you would Vector3._
transform.Rotate(RotationAxis.forward, angle);
}
...
RotationAxis axis = RotationAxis.right;
float angle = 45f;
object1.RotateMe(axis, angle);
axis = RotationAxis.up;
angle = 45f;
object2.RotateMe(axis, angle);
// object2.RotateMe(Vector3.zero, angle); would produce a compile error. Can't be done accidentally.
public Vector3 GetAxis(Axistorotate axis)
{
return vectorAxises[(int)axis];
}
然后在开始时:
public class Rotate : MonoBehaviour
{
public enum Axistorotate { Back, Down, Forward, Left, Right, Up, Zero };
public Vector3[] vectorAxises = new Vector3[7];
public Axistorotate myAxis;
然后做一个函数:
void Start()
{
vectorAxises[0] = Vector3.back;
vectorAxises[1] = Vector3.down;
vectorAxises[2] = Vector3.forward;
vectorAxises[3] = Vector3.left;
vectorAxises[4] = Vector3.right;
vectorAxises[5] = Vector3.up;
vectorAxises[6] = Vector3.zero;
然后像这样使用它:
public void RotateMe(RotationAxis axis, float angle) {
// using axis as a Vector3 guaranteed by type safety to be one of:
// Vector3.right/left/up/down/forward/back
// RotationAxis implicitly converts to Vector3
transform.Rotate(axis, angle);
// you can also just use RotationAxis._ as you would Vector3._
transform.Rotate(RotationAxis.forward, angle);
}
...
RotationAxis axis = RotationAxis.right;
float angle = 45f;
object1.RotateMe(axis, angle);
axis = RotationAxis.up;
angle = 45f;
object2.RotateMe(axis, angle);
// object2.RotateMe(Vector3.zero, angle); would produce a compile error. Can't be done accidentally.
public Vector3 GetAxis(Axistorotate axis)
{
return vectorAxises[(int)axis];
}
或
实际上,您可以使用enum来完成这项工作,就像您所希望的那样。你可以这样做:
public void RotateMe(RotationAxis axis, float angle) {
// using axis as a Vector3 guaranteed by type safety to be one of:
// Vector3.right/left/up/down/forward/back
// RotationAxis implicitly converts to Vector3
transform.Rotate(axis, angle);
// you can also just use RotationAxis._ as you would Vector3._
transform.Rotate(RotationAxis.forward, angle);
}
...
RotationAxis axis = RotationAxis.right;
float angle = 45f;
object1.RotateMe(axis, angle);
axis = RotationAxis.up;
angle = 45f;
object2.RotateMe(axis, angle);
// object2.RotateMe(Vector3.zero, angle); would produce a compile error. Can't be done accidentally.
public Vector3 GetAxis(Axistorotate axis)
{
return vectorAxises[(int)axis];
}
然后在开始时:
public class Rotate : MonoBehaviour
{
public enum Axistorotate { Back, Down, Forward, Left, Right, Up, Zero };
public Vector3[] vectorAxises = new Vector3[7];
public Axistorotate myAxis;
然后做一个函数:
void Start()
{
vectorAxises[0] = Vector3.back;
vectorAxises[1] = Vector3.down;
vectorAxises[2] = Vector3.forward;
vectorAxises[3] = Vector3.left;
vectorAxises[4] = Vector3.right;
vectorAxises[5] = Vector3.up;
vectorAxises[6] = Vector3.zero;
然后像这样使用它:
public void RotateMe(RotationAxis axis, float angle) {
// using axis as a Vector3 guaranteed by type safety to be one of:
// Vector3.right/left/up/down/forward/back
// RotationAxis implicitly converts to Vector3
transform.Rotate(axis, angle);
// you can also just use RotationAxis._ as you would Vector3._
transform.Rotate(RotationAxis.forward, angle);
}
...
RotationAxis axis = RotationAxis.right;
float angle = 45f;
object1.RotateMe(axis, angle);
axis = RotationAxis.up;
angle = 45f;
object2.RotateMe(axis, angle);
// object2.RotateMe(Vector3.zero, angle); would produce a compile error. Can't be done accidentally.
public Vector3 GetAxis(Axistorotate axis)
{
return vectorAxises[(int)axis];
}
或
因此,您希望使用枚举上的switch语句将Axistorotate.Left转换为Vector3.Left?Ty以设置轴。因此,您希望使用枚举上的switch语句将Axistorotate.Left转换为Vector3.Left?Ty以设置轴。