首页 > 解决方案 > 在 Unity 中,我可以让实例化函数接受自定义坐标而不是 Vector3 或 Transform 吗?

问题描述

我想在 hexagonalCoodinates(hexcoordinates) 处实例化 GameObjects(特别是六边形图块)。为此,我编写了一个自定义坐标系。但我发现unity 不接受Vector3 或transform 以外的任何东西。我如何让它做到这一点?或者有没有更简单的方法来做到这一点?

这是生成游戏对象的方法

private void TouchCell(Vector3 point)//This method instantiates cubes
    {
        point = transform.InverseTransformPoint(point);
         HexCoordinates coordinates = HexCoordinates.FromPosition(point);
        
        Instantiate(cubes, coordinates, Quaternion.identity);//<-The coordinate variable here is a hex coordinate.
        Debug.Log("Touched at:" + coordinates);
    }

这是十六进制坐标生成器:

public struct HexCoordinates
{
    public int X { get; private set; }
    public int Z { get; private set; }
    public int Y { get
        {
            return -X - Z;
        } }
    public HexCoordinates(int x,int z)
    {
        X = x;
        Z = z;
    }
    public static HexCoordinates FromOffsetCoordinates(int x,int z)
    {
        return new HexCoordinates(x-z/2, z);
    }
    public override string ToString()
    {
        return "("+X.ToString()+","+Y.ToString()+","+Z.ToString()+")";
    }
    public string ToStringOnSeperateLines()
    {
        return X.ToString() + "\n" +Y.ToString()+ "\n" + Z.ToString();
    }

    public static HexCoordinates FromPosition(Vector3 point)//This converts the Vector3 to Hex coords
    {
       float x = point.x / (HexMetrics.InnerRadius * 2f);
        float y = -x;
        float offset = point.z / (HexMetrics.OuterRadius * 3f);
        x -= offset;
        y -= offset;
        int iX = Mathf.RoundToInt(x);
        int iY = Mathf.RoundToInt(y);
        int iZ = Mathf.RoundToInt(-x - y);
        if (iX + iY + iZ != 0)
        {
            float dX = Mathf.Abs(x-iX);
            float dY = Mathf.Abs(y - iY);
            float dZ = Mathf.Abs(-x-y-iZ);
            if(dX>dY&&dX>dZ)
            {
                iX = -iY - iZ;
            }
            else if(dZ>dY)
            {
                iZ = -iX - iY;
            }
        }
       return new HexCoordinates(iX,iZ);
   }
}

标签: c#.netunity3d

解决方案


只需使用任何方式从您的 HexCoordinates 转换为 Vector3:

  • 为 HexCoordinates 创建方法,类似于 public Vector3 ToVector3() {...}
  • 为隐式转换为 Vector3 创建隐式运算符
public struct HexCoordinates
{
    public int X { get; private set; }
    public int Z { get; private set; }
    public int Y => -X - Z;

    public HexCoordinates(int x,int z)
    {
        X = x;
        Z = z;
    }
    
    ...

    public static implicit operator Vector3(HexCoordinates coords)
    {
        Vector3 result = // convert to Vector3
        // Vector3 result = ToVector3() -- or like this for code reuse
        return result;
    }

    public Vector3 ToVector3()
    {
        Vector3 result = //convert to Vector3
        return result;
    }
}
  

然后您可以扩展 Unity 的 Object 类并为 Instantiate() 方法添加重载,该方法将接受 HexCoordinates,转换为 Vector3 并调用 Instantiate()

public static class ObjectExtension
{
    public static void Instantiate(this Object obj, Object origin, HexCoordinates coords, Quaternion q)
    {
        Vector3 position = coords.ToVector3();
        obj.Instantiate(origin, position, q);
    }
}

此外,如果您为您的 HexCoordinates 创建到 Vector3 的隐式转换,则不需要为 Instantiate() 方法创建重载,因为转换将是隐式的


推荐阅读