【问题标题】:How can I use enum with Vector3 axis?如何将枚举与 Vector3 轴一起使用?
【发布时间】:2019-06-05 15:59:58
【问题描述】:
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);
        }
    }
}

在线:

transform.Rotate(Axistorotate.Left, angle);

我想使用枚举或制作一些我可以在 Vector3.Left 或 Vector3.Right 之间进行选择的东西....以及所有轴,比如枚举。

这个想法是能够在这一行而不是多行上使用简而言之枚举或vector3轴。

【问题讨论】:

  • 所以你想把 Axistorotate.Left 转换成 Vector3.Left?
  • Ty 在枚举上使用 switch 语句来设置轴。

标签: c# unity3d


【解决方案1】:

您实际上可以使用枚举来做到这一点,就像您想要的那样。你可以做这样的事情:

public class Rotate : MonoBehaviour
{
    public enum AxisToRotate { Back, Down, Forward, Left, Right, Up, Zero };
    static readonly Vector3[] vectorAxes = new Vector3[] {
        Vector3.back,
        Vector3.down,
        Vector3.forward,
        Vector3.left,
        Vector3.right,
        Vector3.up,
        Vector3.zero
    };

    public AxisToRotate myAxis;

然后做一个函数:

public Vector3 GetAxis(AxisToRotate axis)
{
    return vectorAxes[(int)axis];
}

然后像这样使用它:

transform.Rotate(GetAxis(AxisToRotate.Left), angle);

transform.Rotate(GetAxis(myAxis), angle);

【讨论】:

    【解决方案2】:

    使用Vector3 常量并将它们分配给Vector3 变量可能是最简单的。但话说回来,有时您想使用类型安全来确保您的方法不会收到意外的轴或Vector3.zero

    你不能只用 enum 来做到这一点(你需要一个开关或一个数组或其他东西来将 enum 解释为 Vector3),但你可以得到类似的东西和自我包含具有私有构造函数、一些只读字段和public static implicit operator Vector3 方法的类:

    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;
        }
    }
    

    使用示例:

    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.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-10
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多