用unity3d vr 开发语言开发游戏哪种语言最好

用Unity3D 开发游戏哪种语言最好_百度知道
用Unity3D 开发游戏哪种语言最好
我有更好的答案
进阶)的学习真正做到无基础到游戏开发高手的人生蜕变! 适用人群 初级游戏研发人员Unity3D实战技术视频教程(进阶篇) 课程目标 通过本系列课程(初级,或者有一定Unity知识以及扎实脚本基础学员、中级,学习完本系列课程中级篇学员
其他类似问题
为您推荐:
您可能关注的推广
unity3d的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁业余爱好者,个人的了解比较有限,希望对你有所帮助。一般的大型游戏开发绝不是用某种语言这么单纯的问题。首先一般的游戏开发架构(Windows平台)从底到顶一般是Direct X(TM)——游戏引擎——游戏。Direct X(TM)相当于所有显卡的一个统一接口,为游戏提供一个利用硬件渲染的编程模型,但Direct X(TM)接口为了追求高性能功能非常单纯和松散,不利于游戏的高效开发。此时就需要根据游戏特点对其进行适当的取舍和封装,实现一组更高抽象的游戏开发接口和框架,可以理解成游戏引擎中的图形引擎。这部分的开发一般使用的语言是C/C++和少量的汇编语言。至于游戏引擎是一个非常复杂的功能聚合体,所有的游戏开发工作都是在之上进行的。包括图形引擎,音频引擎,碰撞引擎,艺术资源管理,脚本引擎等等。到此为止几乎还没有涉及到你所说的游戏开发。首先在图形渲染方面,例如光照阴影处理等等,现代显卡一般是通过可编程着色器实现对图形效果的控制,所采用的编程语言一般是一些着色器语言,例如Direct X(TM)采用的HLSL,OpenGL使用的GLSL等等,语法类似C语言,游戏执行时被编译加载到显卡上,在实现硬件渲染速度的同时又实现了软件编程的灵活性。大型游戏开发的绝大部分工作其实都是在编写游戏脚本,脚本是大型游戏得以如此高速开发和发布的主要原因。脚本化的开发让游戏开发摆脱了硬编码的种种弊端,让游戏内容可以轻易的修改和调试。游戏故事如何进行,各种事件如何触发,何时该播放哪些声音或动画,如何使用艺术团队创作的资源,这些都是在脚本中编写的,可以说引擎决定了游戏能做什么,而脚本才真正决定了游戏做了什么。一些著名的引擎如虚幻系列都有自己独特的脚本语言,其他一些引擎可能会采用一些第三方的脚本语言,比如比较流行的Lua。所以开发一个新游戏最简单的情形就是沿用之前的引擎,创作艺术资源,然后编写脚本将其组织成一个游戏,几乎不需要什么底层的编程语言。开发环境方面,游戏团队内部可能会使用一些开发和设计工具对资源进行处理,可以理解成游戏引擎的IDE,这部分因为是内部工具,而且可能需要经常修改所以一般采用比较高效的开发平台和语言,比如暴雪就是部分使用.NET和C#进行一些内部工具的开发。至于引擎核心的开发,Windows平台比较流行的方法是使用最新版本的Visual Studio,显卡厂商如NVIDIA也会为VS开发一些插件来简化显卡编程和调试。所以一个大型游戏的开发需要庞大的团队使用各种各样的语言和工具来完成。总结一下主要有C/C++,汇编语言,着色器语言,脚本语言,高效的开发语言C#或Java。
大部分公司来说首先要找到一个合适的游戏引擎。国内具备自己研发牛逼引擎的公司不多,特别是3d游戏引擎应该没有吧。找到合适的引擎以后就简单多了,大部分都是用脚本进行二次开发的。&br&&br&单机的不太了解,手游来说,很多是cocos2d-x开发的,刚开始脚本支持不好,很多直接用c++开发。然后LUA支持越来越强,用lua成为首选。现在js支持已经超过lua,加上js功能更丰富,熟悉js的人多,上手快。&br&&br&因此只要主程用c++做一些底层的逻辑和接口。其他各种场景和逻辑,包括UI都可以用js完成。脚本的还可以动态更新,小bug就直接脚本远程更新一下,神不知鬼不觉。另外,游戏会有很多编辑器,除了常见的场景、地图、骨骼、粒子之类编辑器,可以买一些收费的。还会自己开发一些更有针对性的编辑器。用编辑器的人不用对技术非常熟悉,减少了很多策划、美工与开发的沟通成本。所以需要手写代码的量会越来越少。&br&&br&我想端游也应该差不多吧,越是技术越强悍的公司,编辑器开发能力越强,开发速度也就越快。
大部分公司来说首先要找到一个合适的游戏引擎。国内具备自己研发牛逼引擎的公司不多,特别是3d游戏引擎应该没有吧。找到合适的引擎以后就简单多了,大部分都是用脚本进行二次开发的。单机的不太了解,手游来说,很多是cocos2d-x开发的,刚开始脚本支持不好…
高端Console游戏引擎都是C++,没有见过例外。外围倒是有C#,Lua,Python等等其他语言的。
高端Console游戏引擎都是C++,没有见过例外。外围倒是有C#,Lua,Python等等其他语言的。
已有帐号?
无法登录?
社交帐号登录程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之多语言用中文做KEY(七十五)
Unity3D研究院之多语言用中文做KEY(七十五)
围观15646次
编辑日期: 字体:
做多语言的时候用中文做KEY绝对是有100%的好处,如果用英文表示那么代码里面给文字赋值的地方全都是英文,写的代码多了以后维护起来就没有人能看懂了,或者看起来很费劲。
说说用中文做KEY的原理:Unity中给文字赋值的地方就两处, 一个是提前预制在UI Prefab上的文字,还有一个是写在代码里面的文字。那么在开发阶段我们在Prefab和代码里面直接就写中文,等项目后期通过工具把所有中文的地方全部提取出来。然后把提取出来的中文交给策划,让策划他们去翻译去,这样我们之前写的中文就是多语言的KEY,最终显示的界面上的文字是用这个中文KEY读表读出来的。
NGUI里所有的文字都是在UILabel中,可是我们要做图文混排,一般都是在UILabel上在拓展一个自己的脚本,用这个脚本在生成对应的UILabel和UISprite。这篇文章我就先以UILabel来说明原理。
1.遍历所有UIPrefab把包含UILabe(或者是你自己写的)组件找出来,并且把文字提取出来。
2.遍历所有的CS代码,把所有 StrUtil.GetText(“雨松MOMO\n我要换行“); 双引号中间的中文以及字符全部提取出来。
直接上思路代码。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
using UnityEngine;using System.Collections;using UnityEditor;using System.Collections.Generic;using System.IO;using System.Text;using System.Text.RegularExpressions;&public class TestStart :Editor { //UIPrefab文件夹目录 private static string UIPrefabPath = Application.dataPath + "/UI"; //脚本的文件夹目录 private static string ScriptPath = Application.dataPath + "/Scripts";&&&&//导出的中文KEY路径 private static string OutPath = Application.dataPath +"/out.txt";& private static List&string&Localization = null; private static string staticWriteText = ""; [MenuItem("Tools/导出多语言")] static void ExportChinese() {
Localization = new List&string&();
staticWriteText ="";&
//提取Prefab上的中文
staticWriteText +="----------------Prefab----------------------\n";
LoadDiectoryPrefab(new DirectoryInfo(UIPrefabPath));
//提取CS中的中文
staticWriteText +="----------------Script----------------------\n";
LoadDiectoryCS(new DirectoryInfo(ScriptPath));&&
//最终把提取的中文生成出来
string textPath = OutPath;
if (System.IO.File.Exists (textPath))
File.Delete (textPath);
using(StreamWriter writer = new StreamWriter(textPath, false, Encoding.UTF8))
writer.Write(staticWriteText);
AssetDatabase.Refresh(); }& //递归所有UI Prefab static public&&void&&LoadDiectoryPrefab(DirectoryInfo dictoryInfo) {
if(!dictoryInfo.Exists)&& return;
FileInfo[] fileInfos = dictoryInfo.GetFiles("*.prefab", SearchOption.AllDirectories);
foreach (FileInfo files in fileInfos)
string path = files.FullName;
string assetPath =&&path.Substring(path.IndexOf("Assets/"));
GameObject prefab = AssetDatabase.LoadAssetAtPath(assetPath, typeof(GameObject)) as GameObject;
GameObject instance = GameObject.Instantiate(prefab) as GameObject;
SearchPrefabString(instance.transform);
GameObject.DestroyImmediate(instance);
} }&&&&& //递归所有C#代码 static public&&void&&LoadDiectoryCS(DirectoryInfo dictoryInfo) {
if(!dictoryInfo.Exists)&& return;
FileInfo[] fileInfos = dictoryInfo.GetFiles("*.cs", SearchOption.AllDirectories);
foreach (FileInfo files in fileInfos)
string path = files.FullName;
string assetPath =&&path.Substring(path.IndexOf("Assets/"));
TextAsset textAsset = AssetDatabase.LoadAssetAtPath(assetPath, typeof(TextAsset)) as TextAsset;
string text = textAsset.text;
//用正则表达式把代码里面两种字符串中间的字符串提取出来。
Regex reg = new Regex("(?&=StrUtil.GetText\\s*\\(\\s*\"\\s*)[\\s\\S]*?(?=\\s*\")");
MatchCollection mc = reg.Matches(text);
foreach(Match m in mc)
string format = m.Value;
if(!Localization.Contains(format) && !string.IsNullOrEmpty(format)){
Localization.Add(format);
staticWriteText+=format+"\n";
} }&&&&&//提取Prefab上的中文 static public void SearchPrefabString(Transform root) {
foreach(Transform chind in root)
//因为这里是写例子,所以我用的是UILabel
//这里应该是写你用于图文混排的脚本。
UILabel label = chind.GetComponent&UILabel&();
if(label != null)
string text = label.text;
if(!Localization.Contains(text) && !string.IsNullOrEmpty(text)){
Localization.Add(text);
text = text.Replace("\n",@"\n");
staticWriteText+=text+"\n";
if(chind.childCount &0)
SearchPrefabString(chind);
比如这个是个简单界面上赋值的代码。用StrUtil.GetText()去取中文,StrUtiL类是我们自己写的。
123456789101112
using UnityEngine;using System.Collections;public class UIMain : MonoBehaviour { private UILabel mName = null; void Awake ()
mName = transform.Find("name").GetComponent&UILabel&();
mName.text = StrUtil.GetText("雨松MOMO\n我要换行");
mName.text = StrUtil.GetText("我是{0}我的网名{1}","宣雨松","雨松MOMO"); }}
StrUtiL类里面去处理Key从本地数据表里中替换对应多语言显示的文字。
1234567891011121314151617
using UnityEngine;using System.Collections;&public class StrUtil { static public string GetText( string text) {
//通过传进来的中文KEY 去数据表里面读对应替换的多语言文字
return text; }& static public string GetText(string text,params object[] args) {
//通过传进来的中文KEY 去数据表里面读对应替换的多语言文字
return string.Format(text,args); }}
使用工具代码提取,最终将所有多语言中文的地方提取在txt里面。
最后就是让策划拿着生成出来的中文KEY在Excel表里,给出对应的翻译文字。
还有一个重要的知识点就是换行问题,可能你在Prefab上进行的换行的操作,但是\n并不是字符串,所以我们要把\n转成”\n”字符串写进去。
text.Replace(“\n”,@”\n”);
反过来在读取表的时候还是需要再把”\n”字符串转成\n换行符
text.Replace(@”\n”,”\n”);
这样就没问题了。策划也可以直接在数据表里填写\n来进行换行了。
最后的思考
1.开发的过程中可能要修改代码或者要加新功能删功能,所以我们要把差异性的中文Key提取出来,也就是把新增加的KEY 或者 新删除的KEY列举出来。因为没有变化的就不需要策划重新翻译了。
2.最好能直接帮策划生成Excel文件,Windows上很容易,但是MAC就不行。我知道怎么在Mac上读取excel文件,但是我不知道在mac上怎么生成Excel有哪位大神知道还请告知一下我。要能生成.xlsx的那种,谢谢啦。
3.因为要做图文混排,所以UILabel我已经不直接使用了,而是又写了一个类去管理UILable和UISprite, 其实就是根据XML或者JSON 一类的描述符去动态生成UILable和UISprite在帮它的动态的算坐标,算间距 一类的。因为你的中文KEY需要传参数
比如 “我叫{0}我今年{1}大了” 一类的字符串,所以还是在写一个方法。
最后是本文的下载地址,其实本文主要还是提供一个思路。 如果你有对多语言更好的建议,或者是办法,欢迎在下面给我留言,谢谢。
补充, 之前的正则表达式有点问题。因为在代码编写的时候允许中间存在 空格或者换行。 比如下面这样,编译器是不会报错的。。
StrUtil.GetText(“我是222中文”);
StrUtil.GetText ( &#2雨松MOMO” );
StrUtil.GetText
&#雨松520”
所以改一下即可。
string expr = "(?&=StrUtil.GetText\\s*\\(\\s*\"\\s*)[\\s\\S]*?(?=\\s*\")";
MatchCollection mc = Regex.Matches(text, expr);&&&&&&&&foreach (Match m in mc)&&&&&&&&{&&&&&&&&&& Debug.Log(m);&&&&&&&& }
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!用 Unity3D 开发游戏哪种语言最好?
如有可能,请说明 C#, JS, Boo 和 Python 在 Unity3D 中各有什么利弊。
按投票排序
我实际项目中用的C#,库(第三方工具)和资料会多很多,这导致项目碰上问题不会每个都需要造轮子和寻找解决方案相对容易。另外一个方面是,在用unity过程中,C#用多了,unity看多了,js很多的地方也能看的懂,并且能写。所以建议用C#(个人有C、C++背景,所以仅仅是建议)。
c# 毋庸置疑
推荐时用C#,boo用得人较少。unity中的javascript并不是真正的javascript 详见这里
C#是mono原生语言,后面碰到的问题较少。如果想用自己的脚本语言,可以考虑用C#实现该语言的解释器,具体可以参考简悦的一个例子
c#更好,在即将发布的Unity5版本中,官方会加强对C#的支持,而去掉对boo的支持,当然对原来用boo开发的游戏没有影响(官方的消息)。。。我记得大概有超过70%的unity游戏是用c#开发的,而且c#比较js更加适合打架大型的项目
C#比JS更好,面向对象的语言成分控制提供得更多。同时,一些框架性的代码必不可少,写起来稍微罗嗦一些。变量声明时必须指明类型。Boo没用过。Python在我去年用unity3d的时候还没支持吧,难道现在支持了?
Unity3D 5.0 Boo将不会被推荐,官方更推荐UnityScript也就是所谓的JS。很明显熟悉.Net,JAVA的同学大可用C#。其它一侓推荐JS。效率上没差别,但JS比C#简洁明了太多了。别听那些“老学究”的唠叨,现在是NodeJS,Python,Ruby大行其道的时代,所谓“大工程”之类的当放屁就好。
官方貌似推荐js,但是凭借哥4年多的实战经验,团队协作首推C#!屌丝美术创业首推javascript!大项目C# 小项目js,简称大C小J。还有一个原因就是C罩杯就很大,所以项目大就用C#了啊,那才够犀利啊!
希望开放 C++
C#是唯一的选择,一门中规中矩的语言才能用来做靠谱的事情,Javascript这种幼儿园小铲子比较适合用来写50行以下规模的程序。
我也推荐C#,因为面向对象的特性完整,有利于程序设计。。LSSS有点夸张了,不要因为你不习惯就随便说JS是小铲子- -!(JS在web前端照样几万行的代码量),即使在U3D中也没有哪个项目是只有C#而JS不能实现的。。。
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 unity3d 什么语言开发 的文章

 

随机推荐