我想知道用unity3d中的c#获取用户的ISO 3166-1 alpha-2(2个字母代码,例如:US,CA)的可靠方法吗?
我尝试了RegionInfo.TwoLetterISORegionName,但它返回一个空字符串。
它们没有实施吗?
我该怎么做?
编辑:我遇到的主要错误是当我尝试获取它时,TwoLetterISORegionName为空。除非我使用此解决方法,否则CultureInfo和RegionInfo总是将美国作为文化返回:
[System.Runtime.InteropServices.DllImport("KERNEL32.DLL")]
private static extern int GetSystemDefaultLCID();
RegionInfo regionInfo = new RegionInfo(GetSystemDefaultLCID());
CultureInfo cultureInfo = new CultureInfo(GetSystemDefaultLCID());
但是,TwoLetterISORegionName为空,ThreeLetterWindowsRegionName返回类似“Canada”的内容,这对我没用。
希望澄清事情。
更新:
这是我使用上面代码获得的调试信息:
Debug.Log("----- REGION INFO -----"); // Empty
Debug.Log("CurrencyEnglishName : " + regionInfo.CurrencyEnglishName); // Empty
Debug.Log("CurrencyNativeName : " + regionInfo.CurrencyNativeName); // Not implemented exception
Debug.Log("CurrencySymbol : " + regionInfo.CurrencySymbol); // CAD
Debug.Log("DisplayName : " + regionInfo.DisplayName); // Empty
Debug.Log("EnglishName : " + regionInfo.EnglishName); // Empty
Debug.Log("GeoId : " + regionInfo.GeoId); // 959515600
Debug.Log("IsMetric : " + regionInfo.IsMetric); // True
Debug.Log("ISOCurrencySymbol : " + regionInfo.ISOCurrencySymbol); // Canadian Dollar
Debug.Log("Name : " + regionInfo.Name); // Empty
Debug.Log("NativeName : " + regionInfo.NativeName); // Empty
Debug.Log("ThreeLetterISORegionName : " + regionInfo.ThreeLetterISORegionName); // Empty
Debug.Log("ThreeLetterWindowsRegionName : " + regionInfo.ThreeLetterWindowsRegionName); // Canada
Debug.Log("TwoLetterISORegionName : " + regionInfo.TwoLetterISORegionName); // Empty
显然这些是错误的价值(嗯,这是正确的,我在加拿大和所有,但3字母代码不是“加拿大”,并且大地水准面不能是我检查过的那么大的数字),或者我错过了什么!
UPDATE2:在Unity编辑器的内部和内部进一步测试后,我逐渐意识到GeoID总是与众不同......几乎就像一个随机数发生器!这感觉不对......任何人有什么想法?
答案 0 :(得分:0)
终于找到了一个解决方案......而我并不喜欢它,但它确实有效。打开Visual Express 2008(重要的是2008年,因为你不能在以后的版本上更改目标.NET平台,我相信)并使用我在Unity C中使用的完全相同的类(RegionInfo)创建.dll# 。
所以在C ++ / CLR中:使用一个以char *作为参数的函数创建一个.dll,从你从TwoLetterISORegionName获得的System :: String中分配2个字符,就是这样。复制Unity中插件文件夹中的.dll。
在C#/ Unity中:使用DllImport和您的方法名称链接.dll(该方法不会在此处使用char *,而是使用IntPtr)。在这里将字节分配给IntPtr,然后调用C ++函数,然后读取字节,(将它们转换为每个索引的字符),最后不要忘记释放内存。分配,读取和释放与Marshal类一起使用。
对于大量的角色来说这不会很好,但由于我只有2个,所以它并不太糟糕。我知道这是一个粗略的解决方案,并且需要大量的工作,但由于RegionInfo类在Unity中不能很好地工作,这就是我想出的。希望我可以帮助别人!