有没有办法使用Vector3制作开关/案例?

时间:2016-11-08 18:49:31

标签: c# unity3d

我想要做的是在我的角色(ThirdPerSonController)触摸立方体时检测每一面。事实上,我的主要目标是检测我的玩家何时站在立方体表面上。这是我的剧本:

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

    void OnCollisionEnter(Collision collision)
    {
        ContactPoint contact = collision.contacts[0];
        Vector3 normal = contact.normal;
        Vector3 inverseNormal = transform.InverseTransformDirection(normal);
        Vector3 roundNormal = RoundVector3(inverseNormal);

        ReturnSide(roundNormal);
    }

    Vector3 RoundVector3(Vector3 convertThis)
    {
        int x = (int)Mathf.Round(convertThis.x);
        int y = (int)Mathf.Round(convertThis.y);
        int z = (int)Mathf.Round(convertThis.z);
        Vector3 returnVector = new Vector3(x, y, z);
        return returnVector;
    }



void ReturnSide(Vector3 side)
{
    string output = null;
    switch (side)
    {
        case Vector3.down:
            output = "Down";
            break;
        case Vector3.up:
            output = "Up";
            break;
        case Vector3.back:
            output = "Back";
            break;
        case Vector3.forward:
            output = "Front";
            break;
        case Vector3.left:
            output = "Left";
            break;
        case Vector3.right:
            output = "Right";
            break;
    }
    Debug.Log(output + " was hit.");
}

// Use this for initialization
void Start () {

    }

    // Update is called once per frame
    void Update () {

    }
}

我收到了错误:

switch (side)
  

严重级代码描述项目文件行抑制状态   错误CS0151开关表达式或大小写标签必须是bool,char,string,integral,enum或相应的可空类型test.cs 33 Active

3 个答案:

答案 0 :(得分:1)

不,没有办法使用Vector3制作开关/盒子。

  

“开关表达式或案例标签必须是bool,char,string,   积分,枚举或相应的可空类型。“

答案 1 :(得分:0)

你不能在vector3上使用switch / case,但你可以做什么(什么不是最好的解决方案,但会完成这项工作)是转换vector3d.x,z和y并在switch case上运行它们。我不认为它看起来会很好。

答案 2 :(得分:0)

使用C#7,您可以执行此操作。您可以使用when语句:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/switch#the-case-statement-and-the-when-clause

例如,如果您想知道单击了多维数据集的哪一侧,则可以使用以下内容:

void OnMouseDown()
{
    RaycastHit hit;
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    if (Physics.Raycast(ray, out hit, Mathf.Infinity))
    {
        switch (hit.normal)
        {
                case Vector3 v when v.Equals(Vector3.up):
                    Debug.Log("Up");
                    break;
                case Vector3 v when v.Equals(Vector3.left):
                    Debug.Log("Left");
                    break;
                case Vector3 v when v.Equals(Vector3.back):
                    Debug.Log("Back");
                    break;
        }
    }
}

我不确定这种方法的效率。 YMMV。