为什么用unity3d vr 开发开发游戏是用C#JS开发而不是用C++

为什么用Unity3D开发游戏是用C#,JS开发而不是用C++?U3D的设计者是怎样考虑的?
正常来说用C++性能方面不会好一点么?没学过C#和JS,不太了解选择C#和JS优势是在哪方面呢?
按投票排序
首先,我想表达我的观点:并非是Unity选择了C#,而是Mono支持C#,并且C#在Mono支持的编程语言中相对优秀和成熟。Unity 引擎底层是用C++写的,而Mono为它提供了脚本化的环境,所以说Unity选择什么编程语言来作为它的脚本语言,很大程度上取决于Mono,Mono目前支持的语言有C#、Visual Basic、JavaScript、Python、Boo等等,只要官方愿意做这样的事情,编程语言都不是问题。为什么选择C#呢?因为C#是.NET/Mono的主流语言,相对其它语言来说,是一门优秀而成熟的语言,背后由微软提供强力支持;为什么不选择C++呢?答案是为了降低门槛。
现在还有谁做游戏逻辑用c++的,几乎全部是封装的更高层的语言,他们工具齐全,适合快速开发,而c++几乎是快速开发的灾难,U3D被人诟病的是C#和JS都不能热更,更别说c++了,所以有好事者,用lua封装c#,国内手游几乎都是Python或者lua开发。开发周期短,可热更(这对手游来说很重要)。cocos2dx都做了lua接口,适应市场的需求,我们公司的引擎也都是用Python封装或者lua的,c++适合写引擎,却不适合写逻辑。
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。作者:慕容小匹夫链接:来源:知乎Why?从为何需要游戏脚本说起首先聊聊为何现在的游戏开发需要使用游戏脚本这个话题。为何需要有脚本系统呢?脚本系统又是因何而出现的呢?其实游戏脚本并非一个新的名词或者技术,早在暴雪的《魔兽世界》开始火爆的年代,人们便熟知了
一个叫做Lua的脚本语言。而当时其实有很多网游都不约而同地使用了Lua作为脚本语言,比如网易的大话西游系列。但是在单机游戏流行的年代,我们却很少
听说有什么单机游戏使用了脚本技术。这又是为什么呢?因为当时的硬件水平不高,所以需要使用C/C++这样的语言尽量压榨硬件的性能,同时,单机游戏的更
新换代并不如网游那么迅速,所以开发时间、版本迭代速度并非其考虑的第一要素,因而可以使用C/C++这样开发效率不高的语言来开发游戏。 但是随着时间的推移,硬件水平逐年提升,压榨硬件性能的需求已经不再迫切。相反,此时网游的兴起却对开发速度、版本更迭提出了更高的要求。所以开发
效率并不高效,且投资、巨大风险很高的C/C++便不再适应市场的需求了。更加现实的问题是,随着Java、.Net甚至是JavaScript等语言的
流行,程序员可以选择的语言越来越多,这更加导致了优秀的C/C++程序员所占比例越来越小。而网游市场的不断扩大,对人才的需求也越来越大,这就造成了
大量的人才空缺,也就反过来提高了使用C/C++开发游戏的成本。而由于C/C++是门入门容易进阶难的语言,其高级特性和高度灵活性带来的高风险也是每
个项目使用C/C++进行开发时所不得不考虑的问题。 但是随着时间的推移,硬件水平逐年提升,压榨硬件性能的需求已经不再迫切。相反,此时网游的兴起却对开发速度、版本更迭提出了更高的要求。所以开发
效率并不高效,且投资、巨大风险很高的C/C++便不再适应市场的需求了。更加现实的问题是,随着Java、.Net甚至是JavaScript等语言的
流行,程序员可以选择的语言越来越多,这更加导致了优秀的C/C++程序员所占比例越来越小。而网游市场的不断扩大,对人才的需求也越来越大,这就造成了
大量的人才空缺,也就反过来提高了使用C/C++开发游戏的成本。而由于C/C++是门入门容易进阶难的语言,其高级特性和高度灵活性带来的高风险也是每
个项目使用C/C++进行开发时所不得不考虑的问题。一个可以解决这种困境的举措便是在游戏中使用脚本。可以说游戏脚本的出现,不仅解决了由于C/C++难以精通而带来的开发效率问题,而且还降低了使用C/C++进行开发的项目风险和成本。从此,脚本与游戏开发相得益彰,互相促进,逐渐成为了游戏开发中不可或缺的一个部分。而到了如今手游兴起的年代,市场的需求变得更加庞大且变化更加频繁。这就更加需要用脚本语言来提高项目的开发效率、降低项目的成本。
而作为游戏脚本,它具体的优势都包括哪些呢?易于学习,代码方便维护。适合快速开发。开发成本低。因为易于学习,所以可以启用新人,同时开发速度快,这些都是降低成本的方法。因此,包括Unity3D在内的众多游戏引擎,都提供了脚本接口,让开发者在开发项目时能够摆脱C/C++(注:Unity3D本身是用C/C++写的)的束缚,这其实是变相降低了游戏开发的门槛,吸引了很多独立开发者和游戏制作爱好者。
可能与现在安卓性能基本过剩有关、
开发者考虑的是……用任何语言开发都比用 C++ 开发更省事。
C#写起来方便,入门简单,并且本身.net库也提供了很多功能。这样写代码的速度提高了…
首先,提问者应该是说前端语言为什么是C#吧,因为后台可以用C++啊。其次,前端不用的原因有两个,最重要的是C++不能热更新;然后C++程序要稍微贵一点。
因为这里C#比C++方便省事。游戏引擎不需要强大的底层操作能力更不需要指针的灵活性(这些是引擎需要封装起来的东西),而是需要快捷得开发出产品。
已有帐号?
无法登录?
社交帐号登录为什么用Unity3D开发游戏是用C#JS开发而不是用C++_百度知道
为什么用Unity3D开发游戏是用C#JS开发而不是用C++
我有更好的答案
c++适合写引擎,而c++几乎是快速开发的灾难,所以有好事者现在还有谁做游戏逻辑用c++的,我们公司的引擎也都是用Python封装或者lua的,几乎全部是封装的更高层的语言,更别说c++了,他们工具齐全,适合快速开发,却不适合写逻辑,U3D被人诟病的是C#和JS都不能热更,用lua封装c#,国内手游几乎都是Python或者lua开发。cocos2dx都做了lua接口。开发周期短,可热更(这对手游来说很重要),适应市场的需求
你管这么多干嘛?跨平台的本质就这样的啦。。不同的OS底层实现肯定不一样的,只不过他用一个统一的类库封装了这一切,面向开发者的接口是统一的而已。然后直接用C或者CPP封装这个接口有些开发者比较难接受,普及率差,所以直接用LUA等解释性语言调用CPP的普及性更佳好,传播速度快。反正到头来也是解析成CPP的。然后再调用不同OS的特有API开呈现。。。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁漫谈游戏开发和Unity3D(上)
Unity3D是一个用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的综合型创作工具,游戏开发和Unity3D漫谈系列上部分。
天神传、最终幻想V、神庙逃亡2、武士2复仇、仙剑奇侠传OL、调教三国、小小忍者、绝代双骄,这些耳熟能详的游戏是怎样开发出来的?下面给大家带来的是游戏开发和Unity3D漫谈系列上部分,首先说明下这不是强类型技术文章。
Unity3D简介
Unity3D是一个用于创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的综合型创作工具。Unity类似于Director,Blender,Virtools或Torque Game Builder等利用交互的图型化开发环境为首要方式的软件其编辑器运行在Windows 和Mac OS X下,可发布游戏至Windows、Wii、OSX或iOS平台。也可以利用Unity web player插件发布网页游戏,支持Mac 和Windows的网页浏览。它的网页播放器也被Mac widgets所支持。
演示高铁惊魂、打炮弹。
Unity3D:跨多平台(IOS、Android、Windows Phone、Windows、Flash、XBOX360、-PS3、Wii等)游戏引擎,可以开发2D、2.5D、3D游戏。appstore手机上有1500+款用Unity3D开发的游戏。
什么是游戏引擎?开发简单、高度封装(OpenGL、DirectX)。其他游戏引擎: Cocos2d、UDK、 Unreal Engine 3、 Quest3D 等。
Why Unity3D? 跨平台、费用便宜(非开源,有免费版)
游戏开发待遇
Unity3D手机2D游戏开发,试用期工资8.5k以上
5000以下占25%、元占23%、1万以上占16%,金山奖励《剑侠世界》的项目组成员,3辆宝马3,4辆马自达6
游戏开发常识
手游(新增长点)、网游(捉迷藏OL,U3D)、端游(需要下载客户端)、页游(WebGame)
FPS(First Person Shoot/Frame Per second)、MMO( Massively Multiplayer Online,大型多人在线)、RPG(虚拟人生,浪漫庄园)
2.5D(用2D模拟出来的3D,中国2D网游占据8成市场)、锁定视角3D(视角固定,不足够炫,但是不头晕,开发难度低,建模建3面即可)
第三人称、第一人称
单机游戏,网络游戏:大公司使用自主引擎,中小公司使用Java开发的 smartfoxserver 、C#开发的Photon(底层C++) 等
运营商、游戏代理、渠道商:开发商自己要处理推广、支付、打击盗版等,一般和渠道商合作分成。比如《捕鱼达人》android版90%收入来自渠道,Android手机游戏开发的困境,渠道太多,N多打包
游戏公司分工
主要分为策划、美工、程序员、测试、客服等,黑话:主程、主美。
Unity3D基本使用
通过一个例子理解Unity3D开发工具使用(对坐标系暂时先了解)
Hierarchy中Create一个Cube立方体,在Inspector中修改它的Position XYZ为0
添加一个光源照亮场景Directional light,Position XYZ为(0,2,2)
修改摄像机MainCamera(摄像机看到的就是屏幕看到的)的Position为(0,2,-6),看起来清楚一些
Project中Create一个C# Script,编写一个拖动Cube旋转Cube的功能。见备注,先粘贴过来能运行即可
把脚本拖到Cube上(拖到Hierarchy中比较准确)
点击在模拟器中启动运行,再点击停止运行
项目的保存和再次加载:一般打开unity场景文件
第一个例子解析
Unity支持C# 和 JavaScript,国内用C#的占大多数。 JavaScript不是标准语法,叫UnityScript更合适。使用Mono实现C#跨平台,C#编辑工具也是MonoDevlop。如果Unity提示代码编译错误,则到MonoDevelop中Build一下就能看到是什么错误。脚本要取有意义的名字,脚本的名字要和类名一致。
Start、Update是系统预定义的一些方法,当相应事件发生的时候系统就会调用脚本的相应方法,后续还有OnMouseDown、OnGUI,为了简化这些方法不是override父类的用法,类似于Main的调用约定。
脚本是依附于游戏对象的,事件和操作的对象也是当前脚本所在的游戏对象。脚本只能依附于游戏对象或者由其他脚本调用才会运行,一个脚本可以放到多个游戏对象上,是多个实例。一个脚本的多个实例和其他脚本之间互不干扰。
项目运行过程中的修改不会保存。其实相当于调试时改代码立即生效的功能,只是调试结束一切调试期的修改都消失
抗锯齿:主菜单→Edit→Project Settings→Quality,AntiAliasing选为4x(越大越平滑但是越占资源)
体验跨平台:File→Build Settings,构建为exe、flash,如果有android、ios等开发环境还可以构建为手机软件。
理解和美工的分工:在3dsmax中设计出3d模型、贴图出来(打开“希腊圣殿场景”),然后ribbon按钮→导出成FBX格式,FBX拖入Project,接着把模型拖入到Hierarchy,调整它的坐标。把旋转脚本拖到“圣殿”上这样圣殿也就跟着一起旋转了,把Cube的脚本去掉(Inspector中Remove掉Component即可)这样Cube就不旋转了。必须按照Unity3D标准要求设计的3dsmax才能正确导入,资源下载地址:
等。项目路径和FBX文件名不要有中文。
编辑器的使用
Scene:高效操作,按住鼠标右键拖放可以改变预览的时候看的方向、按住滚轮拖放可以横向改变看的部分、滚轮可以前进后退、Hierarchy中双击可以聚焦到元素,放大区域、点击按钮选中一个游戏对象拉着三个方向的箭头就可以在三个方向修改元素的位置。方向键可以更方便的在XZ方向漫游,按着Shift可以加快速度。Hierarchy中Create的时候会自动在当前坐标创建对象,方便建模。
Inspector:暂时想禁用试一下的游戏对象可以在Inspector前的钩去掉、暂时想禁用一下的组件也可以把钩去掉,永久删掉就Remove Component。
Unity多开:建一个快捷方式加上-projectPath参数即可。
C#脚本不支持命名空间,脚本在Project中的显示名称不要加cs,类名要和cs名称一致,所有类继承自MonoBehaviour。跟具体游戏对象无关的脚本可以放到摄像机MainCamera中。不要不正确的给一个游戏对象设置多个脚本对象
初始化不要放到构造函数中,而是放到Start()方法中。
放到游戏对象中的脚本(实例化)可以在Inspector中修改属性,get/set写法属性不被识别,直接public字段就能当属性用,private或者不写修饰符就是私有字段。
脚本中文问题:代码中有中文的话会有乱码问题。到资源管理器中打开项目的Assets文件夹(或点右键Show In Explorer),用unity3d目录下的Editor\Data\Tools\UniSciTE下的UniSciTE.exe打开cs文件,File→Encoding改为UTF-8 with BOM,敲个空格造成修改,然后保存即可(可以修改cs文件打开方式更简单)最好一开始就修改编码,否则会很麻烦。
程序的调试
程序的运行时调试消息输出:Debug.Log(),显示到Console视图(window→console打开)
项目的断点调试:启动MonoDevelop,主菜单Tools→Options→Unity→Debugger的Editor选择Unity开发环境Unity.exe的程序的路径、然后MonoDevelop打开项目(注意Unity不要同时打开这个项目),然后主菜单Run→Run With→Unity Debugger就可以启动调试了。建议使用Debug.Log()调试,优秀程序员的素质。
无论摄像机拍到的图像时怎么变的,GUI永远是显示在屏幕上,不受变形、碰撞、光照的影响。
GUI部分是每帧擦除重绘的,只应该在OnGUI中绘制GUI,按钮:GUILayout.Button(“Hello”); 只读标签:GUILayout.Label()
修改控件的颜色:GUI.backgroundColor = Color.设置背景色,GUI.color设置前景色,影响OnGUI中之后的控件直到下次修改颜色为止。
Hierarchy中的游戏对象不一样,OnGUI是每帧擦除重绘的(有可能一帧调用多次)。GUILayout.Button("Hello")应该理解为画一个Button控件而不是创建一个Button控件:
if(tick%100&50)//每50帧画一次Buton
GUILayout.Button("Hello");
因此,TextBox的输入要成员变量保存当前的值,否则输不进去。 GUILayout.TextField("yzk"),参数为要显示的值,返回值为用户输入的值。 username = GUILayout.TextField(username);
按钮的点击
响应按钮点击:GUI中没有事件概念,鼠标点击了按钮Button返回值就是true,例如:
if(GUILayout.Button("Test"))
Camera.mainCamera.transform.Translate(Vector3.back);
思考下面的代码有什么问题,怎么解决:
if(GUILayout.Button("Test"))
GUILayout.Label("Clicked Test");
案例:实现登陆功能,显示登陆结果。演练一下,常见错误:OnGUI大小写;文件编码、运行提示Compiler Error
GUILayout布局
GUILayout布局默认会伸展控件的尺寸。Button等控件支持params GUILayoutOption[] options可变参数数组,可以通过GUILayout.Width(30)返回一个设置控件宽度的GUILayoutOption对象, Height()、 MinWidth()、MinHeight()等同理,例子:
GUILayout.Button("Test",GUILayout.Width(500),GUILayout.Height(30))
GUILayout采用线性布局,类似于StackPanel,默认是纵向布局。通过GUILayout.BeginHorizontal();开启和GUILayout.EndHorizontal()结束一个横向排列区域,同理BeginVertical() 、EndVertical()。
如果嫌控件太挤,可以使用GUILayout.Space(30);增加若干像素的间隙。
常用GUI控件
密码框:pwd = GUILayout.PasswordField(pwd,'*'),第二个参数为掩码字符,注意帧刷新的问题。
Button只有鼠标抬起才会返回true,这样用Button做发射子弹就不能按下一直发射,可以使用RepeatButton,这样按下期间会一直返回true。案例:Button和RepeatButton实现游戏对象移动。
Tab页: electedToolBarId = GUILayout.Toolbar(selectedToolBarId,new string[]{"装备", "经验", "队友"}); 返回值为激活的按钮的序号。
复选框:isMuted = GUILayout.Toggle(isMuted, "静音");
多行文本区: msgBody = GUILayout.TextArea(msgBody,GUILayout.Width(300),GUILayout.Height(300));
滑动条:纵向,sliderValue = UILayout.VerticalSlider(sliderValue,0,100);返回值为当前值,第二个参数为最小值,第二个为最大值。HorizontalSlider()横向
区域Area,相当于一个控件的盒子,Area中的控件跟着Area移动,BeginArea()开始一个区域,参数指定区域的大小和坐标,EndArea()结束区域。
窗口,区域是没有边框和标题的,也不可以拖放。GUILayout.Window(0, new Rect(50,50,200,200),AddWindow1, "我的窗口"); 第一个参数为窗口的编号,第二个为窗口大小,第三个为void WindowFunction(int windowId)委托,用来绘制窗口内容。
窗口拖拽,在WindowFunction的最后调用GUI.DragWindow()可以启用全屏拖放(给DragWindow传Rect参数可以设定可拖放的区域)。考虑帧刷新的问题,要在OnGUI把Window()的返回Rect保存才可以可拖动,Start()中设定初始位置。
案例:点击【显示装备】显示装备窗口,点击窗口中的【关闭】按钮则关闭
贴图材质Material 画皮
无论是3D的游戏对象还是GUI,好看的效果都是贴图上去的。给Cube贴图:Project中新建Material,选择颜色或者图片,然后把Material拖到Cube上。给Sphere设定一个地球贴图。
给GUI贴图:给脚本增加一个Texture类型的public字段,GUI.DrawTexture(new Rect(100,100,100,100),MyTexture);把Texture画到界面上指定区域。直接把图片从Project拖到脚本的MyTexture属性上即可。
通过代码动态加载贴图:通过代码加载的贴图等资源需要放到Assets的Resources(固定的)目录下,然后Texture2D txt2D = (Texture2D)Resources.Load("meinv");加载。注意meinv这个名字是在Project中的显示的名称,不用带后缀,这个名字和物理文件名可以不一样,可以改名。
做项目是推荐定义public Texture的做法,这样可以方便美工修改贴图,便于分工。NGUI、EZGUI。
案例:用状态机做一个游戏主菜单和选项画面。
3D模型基础
Hierarchy显示的是界面上的游戏对象(GameObject),每个游戏对象都有。至少要有一个Camera,点击Camera就可以在Preview中看到摄像机的视角画面。每个对象(包括摄像机)有Position(位置)、Rotation(旋转,角度)、Scale(缩放大小)三组属性。
Unity3D采用的是:沿屏幕横向为X轴,沿屏幕纵向为Y轴,垂直屏幕方向为Z轴。右、上、背向观众三个方向为正方向。左手坐标系。
Vector3是Unity中定义的一个含有x、y、z三个字段的类,可以表示位置点,也可以表示一个向量。Vector3乘以数值表示对向量的三个值乘以相应的值, v1-v2则表示从v2指向v1的向量。(复习立体几何)
不要用Unity的拖拽开发,很难精细化调整,要手动修改Inspector中的属性。如果Unity的Scene视图显示不正常,就主菜单→Window→Layouts→Revert Factory Settings,恢复出厂设置即可。
常用:Cube立方体、Sphere球体、Capsule胶囊。
游戏对象移动
transform.Translate(vector3)让对象沿着vector3向量的方向移动,比如transform.Translate(new Vector3(0.2f,0.2f,0))就是z轴不动,向斜上方45度运动,每次运动的分量是x、y都是0.2。
Vector3类中内置了up、down、left、right、forward、back、 zero几个简化的静态成员。
鼠标判断:Input.GetMouseButtonDown(0)、GetMouseButtonUp、GetMouseButton。GetMouseButton也是只要按下就一直返回true。案例:键盘方向键控制元素移动。
键盘判断:Input.GetKeyDown(KeyCode.Space),Input.GetKeyUp(KeyCode.LeftArrow),Input.GetKey(KeyCode.A),GetKey像RepeatButton一样只要按下保持住就一直返回true。
案例点鼠标摄像头产生后坐力,按下左键摄像头back移动,松开左键摄像头forward移动。
游戏对象旋转
Unity是左手坐标系,比如transform.Rotate(Vector3.right);是大拇指指向右方,四指指向的方向就是旋转的方向。
案例:键盘控制对象围绕XY轴旋转。见备注。
练习:左右上下键控制摄像头摇头,滚轮(todo)控制摄像头前进后退
RotateAround(v1,v2,angle),元素围绕着世界坐标的v1点采用v2向量旋转angle角度。案例:FixedUpdate中transform.RotateAround(Camera.mainCamera.transform.position,Vector3.up,0.5f) 元素围绕着摄像头运动。
世界坐标和本地坐标
世界坐标系(world)与本地坐标系(local/self)。所有物体的世界坐标系都是相同的、不会改变。每个物体都有一个本地坐标系,当物体旋转时,本地坐标系统也会跟着物体一起旋转。
把Cube的Rotation改为(45,45,45),这样世界(world)坐标和本地(local/self)坐标就不一样了。transform.Translate(Vector3.forward)是向自己坐标前方,transform.Translate(Vector3.forward,Space.World)是向世界坐标前方。
转载自51it技术博客:
相关IT文章Unity3d游戏开发引擎是如何工作的-菜鸟在线
Unity3d游戏开发引擎是如何工作的
Unity3d游戏开发引擎是如何工作的
浏览次数:730
2天前浏览次数:32
3天前浏览次数:31
6天前浏览次数:27
3天前浏览次数:25
浏览次数:240
浏览次数:115
浏览次数:123
浏览次数:139
如果你对以下课程意犹未尽,,查看全部课程
HTML5全栈开发
HTML5最新课程
156 人在学
c#编程概述
C#快速入门
简单又好玩
120 人在学
没有账号?
s后重新发送
已有账号?
已有账号?
验证码确认
话题标题:
400-877-8190
登录后反馈

我要回帖

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

 

随机推荐