如何 关闭main.unity3d main函数

扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
当前位置: &
查看: 7257|回复: 4
Unity3D学习笔记(六)音乐和音效
16排名1昨日变化主题帖子积分
蛮牛币265733
在线时间1834 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
即使AFK魔兽世界已经好多年了,在生活中听到电视或者电台里放的奥格瑞玛的背景音乐的时候还是会虎躯一震。虽然不是联盟玩家,闪金镇狮王之傲旅店的背景音乐依然悠悠回荡在耳边。一个好的游戏没有好的配乐和音效,就好像无暇的水晶缺少了灯光的陪衬。而音乐不仅能渲染出玩家攻略游戏时的氛围,还能增加提高玩家对游戏的认知度。比如我说魂斗罗和超级马力,玩过的同学一定能回想起那简单而经典的声音。还有诸君可曾记得当年整网吧的《红色警戒》激战的声音?还有那《传奇》战士“喝啊哈”的刺杀剑法、道士的治愈术、法师的闪电术的声音?如果都没听过,那你至少听过CS的“Fire in the hole!”和“Terrists/Counter terrists win!”吧,哈哈。反过来也是一样的,还记得几个月前坐火车回杭州,我正玩着《英雄传说:空之轨迹》,结果耳边突然响起一阵《星之所在》的手机铃声。圣光啊,如果是身边的美女那么我们可以相视一笑然后一切尽在不言中……可惜多番寻觅后猛然发现前排的一位大叔正冲着我笑呢……咳,总而言之,音乐的魅力是很大的,有句话说得好,音乐是不分语言、不分种族和不分性别的(这是哪跟哪啊喂)。作为时下热门的,Unity当然少不了对音乐和音效这种基本功能的支持了。本篇笔记就对整个场景背景音乐和瀑布流水声的制作做个记录,不过文字是没办法发出声音的,所以感兴趣的读者们还是亲自动手一试比较好。另外由于这次Unity没有自带的音乐音效可以派上用场,所以我从网上下载了魔兽世界中艾尔文森林的背景音乐和某个瀑布的音效。在工程面板中新建一个文件夹,取名叫做Sound来存放声音资源,然后把两个声音文件直接拖到这个文件夹里,操作跟Windows资源管理器一样,是不是很方便呢?
1.jpg (17.3 KB, 下载次数: 52)
11:37 上传
接下来要介绍一下本篇的第一主人公,Audio Source(声音源)组件,还有第二主人公,Audio Listener(声音收听者)组件。从名字上就可以看出,前者是负责播放声音的,后者是负责接收声音的。为什么需要一个接收声音的组件呢?因为在现实生活中,声音的传播是会递减的,并且耳朵能够分辨声音的方向,比如听声辩位夹苍蝇什么的……哈哈,更贴切的例子应该是像在CS中通过脚步声来判断敌人进攻的方向。为了更加真实地模拟这个效果,所以需要一个收听者的组件来代表收听者的位置。如果跟着我之前的笔记一起做练习,则会发现在Unity窗口左下角的提示信息栏里一直出现这样的字样:“There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene.”,中文意思是“在场景中有两个声音收听者,请确保场景里边一直只有一个声音收听者。”,因为收听者其实就是玩家,所以只需要一个收听者代表玩家的位置就可以了。检查一下Main Camera和First Person Controller里边的Main Camera,可以在检视面板中发现他们都带了Audio Listener组件,由于游戏中只需要一个镜头来代表玩家的视野就可以了,所以干脆把Main Camera直接删除掉。运行一下游戏,发现烦人的提示消失啦。清理过Audio Listener之后,就可以制作环境音乐效果了。思路很简单,因为背景音乐是一直能够被玩家听到的,所以给First Person Controller中的Main Camera加个声音源,相当于有个随身听一直在我们耳边播放音乐。有了思路后就可以按想好的步骤进行操作了,首先选中在First Person Controller里边的Main Camera,然后在主菜单中点击“Component→Audio→Audo Source”为其创建声音源组件,然后在检视面板中就可以看到对应的组件了。
选项比较多,但是比起来上一篇的粒子系统来说还是小巫见大巫了,而且功能也是一目了然,比较好理解。同样也请注意下面的功能选项解释留个印象就好,不需要完全背下来。
2.jpg (40.06 KB, 下载次数: 51)
11:37 上传
Audio Clip(声音剪辑): 也可以叫声音片段,把点右边那个小原点就能选择需要播放的声音了,也可以在工程面板中直接把声音资源拖到上面。Mute(是否禁音): 这个好理解,勾上就不会发出声音了。Bypass Effects(忽略声音效果): 不知道是干嘛的……Play On Awake(唤起时播放): 如果勾选这个,那么当First Person Controller被加载到游戏场景中时音乐就会自动播放。Loop(是否循环): 这个也简单,如果勾上那么音乐播放完毕后会再从头开始播放。Priority(优先级): 当游戏里同时播放的音乐数量太多时,优先级低的音乐可能不会被播放,调整优先级可以防止背景音乐这种重要的音乐被忽略。 0-最重要,256-最不重要,128-默认Volume(音量): 还有比这个更容易理解的选项吗^_^Pitch(音调): 虽然功能名写的是音调,但是好像是用来调整声音播放速率的。当然播放速率高了,音调也会变高,反之则会变低。
3D Sound Setting(3D声音设置)Doppler Level(多普勒效应等级): 好吧,这是个物理知识点,点这里问度娘吧。Volume RollOff(音量过渡模式) 这里可以设定当玩家从远处靠近声音源的过程中,音量的渐变方式。 1、Logarithmic Rolloff(对数过渡模式) 2、Linear Rolloff(线性过渡模式) 3、Custom Rolloff(自定义过渡模式) 唔,涉及到数学,不过完全可以不理会这些这么专业的叫法,只要看那个XY坐标系就可以了。
横坐标表示收听者与声音源的距离,纵坐标表示音量。所以红色线曲线就代表距离与音量的变化,绿色曲线好像是用来调整声像的,也就是让声音出现在左右声道的比例,像CS一样模拟出声音是在玩家的前后方和左右方,具体我也没有搞明白……不过在本篇里也不需要用到这个功能。蓝色曲线则代表声音从声音源发出的传播角度。Min Distance(最小距离)、Pan Level(声音均衡等级)、Spread(传播角度)、Max Distance(最大距离): 这些其实都是用来调整曲线的,可以自己手动调一下。
Sound Settings(2D声音设置)Pan 2D(2D声音均衡):可以用来调整左右声道,-1.0为最左,1.0为最右,0.0为均衡。
了解完声音源的属性后回到本篇的目标,添加背景音乐。由于声音源就在收听者的位置上,所以只要把艾尔文森林的声音拖到Main Camera的Audio Source的Audio Clip上,勾选循环播放,其他参数完全不需要动。然后就是给瀑布添加音效,如法炮制给WaterFall添加Audio Source,并设定好瀑布的音效。过渡模式要调整为线性过渡,因为要实现离瀑布越近,声音越大的效果。如下图所示:
3.jpg (17.7 KB, 下载次数: 80)
11:37 上传
这是我在运行游戏模式下的图,会有个Listener的竖线,它表示收听者离该声音源的当前距离。并且可以看出此时的音量大概是0.7多,声音均衡是1.0,传播角度是0,虽然我也不知道这两个参数为什么要这么设置…希望能在以后的学习过程中理解。至此我的游戏世界里已经能听到艾尔文森林那悠扬的乐声了,远方还传来轰隆隆的瀑布声,真是很有成就感啊,哈哈。
作者:黄旭杨 /archives/28
ugui 音效; 播放音效; 真机测试播放不了音效;u3d 关声音;unity3d 声音动态模拟;unity音效缓存;u3d 播放mp3;u3d 声音设置;unity音频下载;u3d 3dsound批量勾选;unity 平滑播放声音;unity3d同时播放声音;unity 3unity 定时器;u3d 声音怎么关;u3d 监听声音结束;unity3dunity 声音范围;unity 关闭声音;unity 游戏音;怎么学习unity3d;如何学习unity3d;unity3d的学习总结;unity3d 学习;unity3d学习需要什么;unity3d深入学习;unity3d如何学习;unity3d 加音效;unity3d手机如何设置;unity 背景音乐;unity 视野范围;unity 视野;unity当在视野内;unity 5unity 无粒子效果;unity 云 粒子效果;unity 粒子播放;unity最简单的游戏;unity在哪儿下载场景;unity 3unity小游戏工程文件;unity 5unity播放本地音乐;unity音乐播放;unity 播放音乐;unity3d可以做游戏吗;unity3d 做2d游戏;unity 背景循环;unity 循环背景;unity3d 怎么加背景图;unity能做;unity3d 5.3.3渲染设置;unity 多场景 选择;unity3d设置语言;unity 游戏菜单;unity设置语言;unity3d支持 语言;unity3d支持的语言;unity 5unity3d设置中文;unity 设置中文;unity3d 例子怎么下载;firstunity支持 语言;unity 支持的三种语言;unity 创建场景;场景渲染unity场景贴图;unity 沿轨迹移动;unity3d声音添加;unity 瀑布怎么做;unity 铃声;unity点击播放;unity 如何添加背景图;unity3d 怎么让main camera
每日推荐:
蛮牛相关业务合作(市场合作/项目需求/人才招聘)联系-崇慕 QQ:
72079/5000排名<font color="#FF昨日变化主题帖子积分
日久生情, 积分 2079, 距离下一级还需 2921 积分
日久生情, 积分 2079, 距离下一级还需 2921 积分
蛮牛币4982
在线时间240 小时
好东西,支持支持。。。
每日推荐:
118/50排名<font color="#FF昨日变化33主题帖子积分
注册看看, 积分 18, 距离下一级还需 32 积分
注册看看, 积分 18, 距离下一级还需 32 积分
在线时间1 小时
学到了,不错哈
每日推荐:
9排名<font color="#FF昨日变化4主题帖子积分
蛮牛币2881
在线时间165 小时
谢谢分享,受教了,楼主辛苦了。
每日推荐:
287/150排名<font color="#FF昨日变化9主题帖子积分
初来乍到, 积分 87, 距离下一级还需 63 积分
初来乍到, 积分 87, 距离下一级还需 63 积分
在线时间22 小时
谢谢分享~~~
楼主萌萌哒~
每日推荐:
蛮牛论坛干货区作者
社区QQ达人
使用QQ帐号登录论坛的用户
认证开发者
经过游戏蛮牛认证的独立开发者漫谈游戏开发和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文章匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。非常详细的测试unity与android之间的通讯操作 - stephen830 - ITeye博客
博客分类:
非常详细的测试unity与android之间的通讯操作
这段时间在研究嵌入sdk,途中遇到不少问题和坑,在这就不一一说了。嵌入sdk是比较常见的吧,如接入广告啊, 新浪的分享...... 这些都需要接入sdk的。(这些我在这段时间都应以研究成功了,后期会写上)。现在我们从最基本的做吧。
其实这些和什么引擎都是没多大关系的。不管是 unity,还是cosos2d......
说白了,这些就是和移动平台有关系。ios,android,wp8啊。
如果你不熟悉android,没关系,即使你是从未打开过eclipse都可以,因为我把详细步骤给以图片的方式展示出来。现在我们就从最基本的做起吧。主要是实现在unity中去调android的方法。其实这个很简单,只是为了从未接触过安卓的人才弄的这样详细。(我以前没接触过安卓,当时多么希望能有一份这样的教程教导我啊。)
打开eclipse,新建一个安卓的工程。
在 这里要注意我们的包名,和最低的sdk,包名的话我们在unity中导出的时候需要用到。至于最低的sdk就是一个兼容问题了,如果我们选4.0一下的 话,那当我们在unity导出的时候会报错误的。我在这坑了很久很久,最后才发现一系列的错误是这个因起来的。最好是要在32位的sdk,jdk中进行 吧,这样会少很多莫名的错误问题, 注意的就是我在下图圈起来的地方。
我们一直狂点下一步,当我们看见这个时,就是最后一步了。
如果大家都没错,创建的新工程就是如下一样了。我圈起来的地方多是会用到了,需要注意的地方。
2.现在我们安卓工程创建好了,就到了开始编写的时候了。我们打开unity的安装目录
例如:D:\Program Files (x86)\Unity\Editor\Data\PlaybackEngines\androidplayer\bin找到class.jar 。
这个是unity帮我们封装好了的jar包,我们要用到该包。
然后我们将class.jar,放进我们的安卓工程去。直接拖进libs目录就可以。如图
现在我们来引用下吧,选中它,右键.......... 如下:
3. 好了,现在我们把重要的都加进来了,那我们现在就来做个简单的实验,就是点击unity中德按钮,打开一个安卓的ACtivity吧。我们首先要做的就是 把这个Activity布局。我们在res--layout文件夹下找到activity_main打开,加入这些内容:
&?xml version="1.0" encoding="utf-8"?&
&ScrollView
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.ITFFuture.testua.MainActivity"
tools:ignore="MergeRootFrame" &
&LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"&
android:id="@+id/textView0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#000000"
android:textSize="18sp"
android:background="#00FF00"
android:text="测试Unity和Android之间额通讯"
android:gravity="center_vertical|center_horizontal"
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#FFFFFF"
android:textSize="18sp"
android:background="#0000FF"
android:text="大家好,我是安卓的Activity"
android:gravity="center_vertical|center_horizontal"
android:id="@+id/button0"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="关闭这个Activity"/&
&/LinearLayout&
&/ScrollView&
我们的内容转成实际界面是这样的样子。
现在我们来新建一个Class,取名为OpenActivity1,如图:
然后我们接入代码,代码内容如下:
package com.ITFFuture.
import android.app.A
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.TextV
public class OpenActivity1 extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text = (TextView)this.findViewById(R.id.textView1);
text.setText(this.getIntent().getStringExtra("name"));
Button close = (Button)this.findViewById(R.id.button0);
close.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
OpenActivity1.this.finish();
这个代码很简单,,改变中间的字母内容,是点击关闭按钮,关闭此Activity.最终效果如下:
好了,现在我们在MainActivity中谢方法吧,这个Activity就相当于第一个场景。 MainActivity的内容:
package com.ITFFuture.
import com.unity3d.player.UnityPlayerA
import android.os.B
import android.app.A
import android.content.C
import android.content.I
public class MainActivity extends UnityPlayerActivity {
Activity mActivity=
Context mContext =
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mActivity=
mContext =
StartActivity1("我是通过安卓中显示的Activity");
public void StartActivity1(String name)
// TODO Auto-generated method stub
Intent intent = new Intent(mContext,OpenActivity1.class);
intent.putExtra("name", name);
mActivity.startActivity(intent);
还有最后一点,要配置AndroidManifest.xml.声明我们定义的Activity.
&?xml version="1.0" encoding="utf-8"?&
&manifest xmlns:android="/apk/res/android"
package="com.ITFFuture.testua"
android:versionCode="1"
android:versionName="1.0" &
android:minSdkVersion="8"
android:targetSdkVersion="18" /&
&application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" &
android:name="com.ITFFuture.testua.MainActivity"
android:label="@string/app_name" &
&intent-filter&
&action android:name="android.intent.action.MAIN" /&
&category android:name="android.intent.category.LAUNCHER" /&
&/intent-filter&
&/activity&
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
android:name=".OpenActivity1"&
&/activity&
&/application&
&/manifest&
我们主要是声明了我们自己的Avtivity,这个很重要,在后期加入广告啊,新浪微博分享爱啊....
好了,那我们最终来导出jar包吧。在导出之前还是先刷新下(F5),和Build 下Project.
我们现在来导出吧。
现在我们的jar包已经成功导出了。是这样子的 我们在安卓中的所有操作也就完成了哈,现在接下来的就是如何和unity进行互通了。
上面导出的jar文件(Test.jar)如果用解压软件打开会发现,除了class文件,还有项目中的资源文件、lib库,这样虽然这个jar文件在unity中可以使用,但增大了文件大小,因此可以用下面的方法来导出一个纯净的jar文件(只含有class文件)。
代码所有的.class文件都生成在了Android工程的bin文件夹中,当前工程的路径是 TestUA-&bin-&classes-&com-&ITFFuture-&testua-&你的.class文件。下面需 要对这些.class文件进行打包,苹果系统的话打开电脑的终端,cd到classes文件夹的目录下,接着执行代码
jar -cvf Test.jar *
这行代码的意思是把当前目录下的所有.class文件打包成.jar文件,保存文件名称为Test.jar。你可以再解压看看,可以看到厘米只有class文件。
3.从unity中去调用
在 unity中,我们新建一个Plugins文件夹,Plugins下面又建Android文件夹,Android文件夹下再建一个bin文件夹,我们将我 们导出的jar包放进这个文件夹下,然后我们在eclipse中的res文件复制一份放入Android。也要把AndroidManifest.xml 放进Android目录下。详细情况如下:
现在我们新建一个脚本吧。用来调用安卓中那个StartActivity1方法。
using UnityE
using System.C
public class js001 : MonoBehaviour {
private AndroidJavaObject m_
// Use this for initialization
void Start () {
AndroidJavaClass jc = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
m_activity = jc.GetStatic&AndroidJavaObject& ("currentActivity");
void OnGUI(){
//call hello world
if(GUI.Button(new Rect(50,50,200,40),"Open Activity")){
m_activity.Call("StartActivity1","Unity中调出android的方法了");
if(Input.GetKey(KeyCode.Escape)||Input.GetKey(KeyCode.Home)){
Application.Quit();
// Update is called once per frame
void Update () {
最后我们导出apk吧。在其中要设置一项。就是包名。这个要和安卓工程的包名一模一样哦。
然后我们运行下吧。
在刚开始的时候我们会看安卓中德Activity,然后我们点击关闭按钮,就能看那Unity的Scene了。这个是我们点击Open Activity这个按钮时候,安卓中的Activity又被我们打开了。
好了,测试成功!!
遇到的问题:
1. U3D导出安卓版本,总会出现Unable to find unity activity in manifest. You need to make sure orientation attribut is set to portrait manually.
解决方法:在AndroidManifest.xml加入一行参数就可以了。
&meta-data android:name="unityplayer.UnityActivity" android:value="true" /&
参数位置如下图:
浏览 27483
stephen830
浏览: 1849615 次
来自: 上海
使用Netty进行Android与Server端通信实现文字发 ...
非常感谢,正好用上
提示的/222.177.4.242
无法链接到ip地址,是什 ...

我要回帖

更多关于 unity maintex 的文章

 

随机推荐