有没有一种方式可以使用Vector3来实现switch/case?

6

我想要做的是当我的角色(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 switch表达式或case标签必须是bool、char、string、integral、enum或对应的可空类型 test.cs 33 活动

此处报错信息提示"switch表达式或case标签必须是bool、char、string、integral、enum或对应的可空类型",需要对代码进行修改以满足这个要求。

3
简单的回答是不行,忘了这个吧。你需要做的非常简单,就是在每个面上放置一个触发器或碰撞器。这是制作视频游戏的绝对基础。祝你玩得愉快。 - Fattie
3个回答

3

使用C# 7,你可以这样做。你可以使用when语句:

https://learn.microsoft.com/zh-cn/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;
        }
    }
}

我不确定这种方法的效率。可能因人而异。


1

不,无法使用Vector3创建switch/case。

“switch表达式或case标签必须是bool、char、string、整数、枚举或对应的可空类型。”


0

不,你不能在Vector3上使用switch/case语句,但是你可以做的(虽然不是最好的解决方案,但可以完成任务)是将Vector3d.x、z和y转换并运行它们,然后使用switch case语句。但我认为这样看起来不太好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接