c# - 在 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);
}
}
解决方案
只需使用任何方式从您的 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() 方法创建重载,因为转换将是隐式的
推荐阅读
- android - 如何从firebase获取即时recyclerview项目?
- c# - 将 EDMX 迁移到 EF Core 的最简单方法
- spring-boot - 如何将 Spring Boot 应用程序的构建名称和版本存储在哨兵错误日志中?
- mysql - ssl.SSLError - 不支持的协议?
- c# - Azure 上传文件时,抛出异常“指定的 blob 不存在”
- c++ - 枚举类在 C++ 中不接受带有连字符/破折号的文本
- flutter - 在颤动中将日历日期时间与 yyyy-mm-dd 格式进行比较
- parallel-processing - Flink 工作流并行与自定义源
- reactjs - 如何在 create-react-app 中更改 img-src CSP 指令
- ruby-on-rails - 如何在活动管理员中跟踪管理员活动