Unity3D入门之JavaScript
刚刚接触Unity3D游戏引擎,这里做点学习笔记。下面是我建立的简单场景,左侧的Hierarchy(层次)视图里显示了场景中所有游戏对象,这些基本对象可以从Create下拉菜单里创建。当你点击某个对象,比如立方体Cube时,在右侧Inspector(监视)中可以看到Cube对象的详细信息,比如它的位置信息、表面材质信息,然后可以在其中修改。下方的Project视图中的Assets(资源)里显示了游戏中所有资源,这里注意与Hierarchy视图里对象的区别,我们的游戏脚本放在Assets里。刚开始学习Unity3D,我会反感那些脚本,总希望不需要写代码就能创建自己的游戏,但后来发现,在Unity3D中不写脚本是不可能的,脚本完全就是一切的逻辑。
要在Scene(场景)视图里创建物体,可以在左侧的Hierarchy视图里点击Create下拉菜单,选择创建即可,我这里创建了一个平面Plane、两个立方体Cube和MyCube、一个摄像机MainCamera、一个圆柱体Cylinder。在Scene中,按住ALT键,用鼠标就可以旋转整个场景;按住鼠标中键,可以拖动场景视图;用鼠标滚轮可以缩放视图。
要给场景中的物体上色,比如平面Plane,只需要点击对象Plane,然后在右侧Inspector中做些设置即可。那么如何改变物体表面的颜色了,是直接修改吗?不是,有点图像学基础的都知道,要改变表面颜色,实际要改变的是物体的表面材质,材质中可以包含各种复杂信息。要创建材质,可以在Assets视图中点击右键,选择Create->Material即可,然后在Inspector中修改Main Color属性即可。最后点击Plane对象,在右侧点击Materials里Element0最右边的小圈,选择想要的材质,也可以直接把Assets里的材质拖放到Element0上即可。
在Create里只能创建一些基本模型,下面学习用JavaScript脚本在场景中创建游戏界面元素,比如按钮、文本框、图片等。我看的书是《Unity3D游戏开发》,最开始讲的就是JavaScript,后面会讲C#作为脚本语言。下面是我自己的一个练习的截图。
界面有点乱,也懒得改了。最上面的是几个旋转视图的按钮,左边绿色的文字,接着是一幅图片、滑动条。下方是输入框、图片按钮。比较显眼的是3个窗口,窗口里的元素坐标都是相对的。我在代码中都有详细的注释,也不需要做什么说明了。要使用脚本,先在Assets里创建javaScript,打开编辑器复制我的代码。然后点击左侧的Main Camera对象,把脚本文件拖动到右侧中即可。可能会出现编译错误,无法运行,那是因为我没有提供材质、图片。点击Main Camera对象,点击右侧Inspector里的脚本文件,展开它的属性,会看到Image Texture、Button Texture这些变量,凡是在JavaScript里的public修饰的变量就会出现在这里,要给这些变量赋值才可以正常运行。
我这里需要赋值的是Image Texture、Button Texture、View Texture 0,这三个都是图片,从Assets里拖放三个图片赋给它们即可。下面还有一个My Skin变量,是Unity里的皮肤,比如决定按钮的颜色,可以被很多按钮使用,也是在Assets里直接创建即可。对于Unity3D里的GUI控件,简单的有Label(文本)、Button(按钮)、TextField(文本框)、ToolBar(工具栏)、Slider(滑块)、ScrollView(滚动显示区域)等。
群组视图(Group View控件):将多个视图放在一个群组中,群组视图里的坐标都是相对的。修改群组视图坐标,里面所有元素坐标都会变化。
GUILayout:相对与GUI控件,GUILayout控件的创建不需要设定显示区域,不指定具体坐标,可以动态适应窗口。比如绘制一个按钮,如果用GUI控件,需要指定按钮的长度,如果按钮上的文字长度超出了按钮长度,超出部分便无法显示了。如果使用GUILayout,便可以动态自适应。
帧动画:在加载图片动画时,我使用了Resources.Load()这样的方法,注意需要在Assets里创建Resources目录,然后把动画资源放在其中。
刚体(Rigidbody):在Unity中可以给对象添加这个属性,比如立方体,添加后的立方体可以和其它物体产生碰撞反应,变成了一个具有物理属性的物体,比如可以自由裸体运动。要添加这个属性,先选择对象,然后在菜单栏里选择Component->Physics->Rigidbody即可。
#pragma strict var str1 : String;//外部字符串 var imageTexture : Texture;//外部贴图 var buttonTexture : Texture2D;//按纽图片 var viewTexture0 : Texture2D; var TranslateSpeed = 20;//模型移动速度 var RotateSpeed = 1000;//模型旋转速度 private var username : String;//用户名 private var password : String;//密码 private var imageWidth : int;//图片宽度 private var imageHeight : int; private var screenWidth : int;//屏幕宽度 private var screenHeight : int; private var select : int;//工具栏选择按钮的ID private var barResource : String[];//工具栏按钮字符串 var verticalValue : int = 0;//纵向滑动条数值 var horizontalValue : float = 0.0f;//横向滑动条数值 var scrollPosition : Vector2;//滚动条位置 var mySkin : GUISkin;//自定义皮肤 private var choose : boolean = false;//单选控件是否选中 //默认窗口位置 private var window0 : Rect = Rect(770,100,250,100); private var window1 : Rect = Rect(600,200,400,300); var winArrayList = new ArrayList();//用于存储窗口 private var animUp : Object[];//动画数组 private var animDown : Object[]; private var animLeft : Object[]; private var animRight : Object[]; private var map : Texture2D;//地图贴图 private var tex : Object[];//当前人物动画 private var x : int = 400;//人物的x坐标 private var y : int = 400;//人物的y坐标 private var nowFrame : int;//帧序列 private var mFrameCount : int;//帧总数 private var fps : float = 10;//一秒多少帧 private var time : float = 0;//限制帧的时间 //程序开始函数,变量初始化 function Start () { screenWidth = Screen.width; screenHeight = Screen.height; imageWidth = imageTexture.width; imageHeight = imageTexture.height; str1 = "点击click"; username = ""; password = ""; select = 0; barResource = ["Toolbar1","Toolbar2","Toolbar3"]; scrollPosition[0] = 50; scrollPosition[1] = 50; //添加一个窗口 winArrayList.Add(Rect(winArrayList.Count*100,400,150,100)); //得到帧动画中的所有图片资源 animUp = Resources.LoadAll("up"); animDown = Resources.LoadAll("down"); animLeft = Resources.LoadAll("left"); animRight = Resources.LoadAll("right"); tex = animUp; } //每一帧都要执行的更新 function Update () { } //绘制GUI界面组件 function OnGUI() { //设置GUI背景颜色 GUI.backgroundColor = Color.red; //设置一个按钮,规定一个矩形区域 if (GUI.Button(Rect(10,10,70,30), "向左旋转")) { //transform为当前绑定模型的变换对象,设置模型旋转 //Time.deltaTime:表示完成最后一帧的时间,单位为秒 transform.Rotate(Vector3.up * Time.deltaTime * (-RotateSpeed)); } if (GUI.Button(Rect(170,10,70,30), "向右旋转")) { transform.Rotate(Vector3.up * Time.deltaTime * RotateSpeed); } if (GUI.Button(Rect(90,10,70,30), "向前移动")) { transform.Translate(Vector3.forward * Time.deltaTime * TranslateSpeed); } if (GUI.Button(Rect(90,50,70,30), "向后移动")) { transform.Translate(Vector3.back * Time.deltaTime * TranslateSpeed); } if (GUI.Button(Rect(10,50,70,30), "向左移动")) { transform.Translate(Vector3.left * Time.deltaTime * TranslateSpeed); } if (GUI.Button(Rect(170,50,70,30), "向右移动")) { transform.Translate(Vector3.right * Time.deltaTime * TranslateSpeed); } //显示文字信息Label GUI.color = Color.green; GUI.Label(Rect(250,10,200,30), "模型的位置" + transform.position);//设置一个文本框 GUI.Label(Rect(250,50,200,30), "模型的旋转" + transform.rotation); GUI.Label(Rect(450,10,200,30), "屏幕宽度:" + screenWidth); GUI.Label(Rect(450,50,200,30), "屏幕高度:" + screenHeight); //显示图片Label GUI.color = Color.white; GUI.Label(Rect(600,10,imageWidth,imageHeight), imageTexture); //显示图片按钮Button GUI.backgroundColor = Color.white; GUI.Button(Rect(250,90,buttonTexture.width,buttonTexture.height),buttonTexture); //显示文本框TextField GUI.backgroundColor = Color.white; username = GUI.TextField(Rect(0,90,100,30),username,15); password = GUI.PasswordField(Rect(120,90,100,30),password,"?"[0],15); //显示工具栏Toolbar select = GUI.Toolbar(Rect(0,140,barResource.Length * 100, 30),select,barResource); switch(select) { case 0: GUI.Label(Rect(10,180,200,30),"X"); break; case 1: GUI.Label(Rect(10,180,200,30),"Y"); break; case 2: GUI.Label(Rect(10,180,200,30),"Z"); break; default: break; } //显示滑块Slider verticalValue = GUI.VerticalSlider(Rect(750,10,30,100),verticalValue,99,0); horizontalValue = GUI.HorizontalSlider(Rect(820,10,100,30),horizontalValue,0.0f,100.0f); GUI.Label(Rect(780,20,18,100), "纵向进度" + verticalValue); GUI.Label(Rect(820,30,100,20), "横向进度" + horizontalValue); //开始群组视图,将多个组件放在一个群组中,群组中组件坐标都是相对坐标;修改群组坐标,其中所有坐标都会改变 GUI.BeginGroup(new Rect(10,230,200,400)); GUI.DrawTexture(Rect(10,20,viewTexture0.width,viewTexture0.height),viewTexture0); GUI.Label(Rect(10,70,100,40),"群组视图1"); GUI.Label(Rect(10,100,100,40),"按钮"); GUI.EndGroup(); //注册窗口 GUI.Window(1001,window0,oneWindow,"第一个窗口"); GUI.Window(1002,window1,twoWindow,"GUILayout"); //自定义皮肤 GUI.skin = mySkin; GUI.Button(Rect(300,230,120,30),"自定义皮肤按钮"); GUI.Toggle(Rect(300,270,100,30),choose,"单项选择"); //自定义皮肤风格组件Custom Styles GUI.Button(Rect(450,230,120,30), "Custom0Button", "Custom0"); GUI.Button(Rect(450,270,120,30), "Custom1Button", "Custom1"); //遍历每个窗口,并加入视图 var count = winArrayList.Count; for (var i = 0; i < count; i++) { winArrayList[i] = GUILayout.Window(i,winArrayList[i],AddWindow,"窗口ID:"+i); } //绘制帧动画 DrawAnimation(tex, Rect(x,y,32,48)); GUI.BeginGroup(new Rect(400,120,200,400)); //点击按钮移动人物 if (GUILayout.RepeatButton("向上")) { y-=2; tex = animUp; } if (GUILayout.RepeatButton("向下")) { y+=2; tex = animDown; } if (GUILayout.RepeatButton("向左")) { x-=2; tex = animLeft; } if (GUILayout.RepeatButton("向右")) { x+=2; tex = animRight; } GUI.EndGroup(); } //窗口1 function oneWindow(windowID: int) { if (GUI.Button(Rect(10,50,80,30),"普通按钮")) { Debug.Log("窗口ID=" + windowID + "按钮被点击"); } //GUILayout界面布局 if (GUILayout.Button(str1)) { str1 += str1; } } //窗口2 : GUILayout function twoWindow(windowID : int) { //线性布局 GUILayout.BeginHorizontal(); GUILayout.Box("开始水平布局"); GUILayout.Button("按钮"); GUILayout.Label("文本框"); GUILayout.TextField("输入框"); GUILayout.EndHorizontal(); GUILayout.BeginVertical(); GUILayout.Box("开始垂直布局"); GUILayout.Button("按钮"); GUILayout.TextArea("输入区域"); GUILayout.EndVertical(); //控件偏移、对齐 GUILayout.BeginArea(Rect(0,150,200,60));//开始一个显示区域 GUILayout.BeginHorizontal();//外层横向布局 GUILayout.BeginVertical();//嵌套一个纵向布局 GUILayout.Box("Test1"); GUILayout.Space(10);//两个Box控件中间偏移 GUILayout.Box("Test2"); GUILayout.EndVertical();//结束嵌套的纵向布局 GUILayout.Space(40);//两个纵向布局间偏移 GUILayout.BeginVertical();//嵌套一个纵向布局 GUILayout.Box("Test3"); GUILayout.FlexibleSpace();//设置对齐 GUILayout.Box("Test4"); GUILayout.EndVertical();//结束嵌套的纵向布局 GUILayout.EndHorizontal();//结束外层横向布局 GUILayout.EndArea();//结束一个显示区域 } //添加新窗口 function AddWindow(windowID : int) { if (GUILayout.Button("添加新窗口")) { winArrayList.Add(Rect(winArrayList.Count*100,500,80,80)); } if (GUILayout.Button("关闭当前窗口")) { winArrayList.RemoveAt(windowID); } GUI.DragWindow(Rect(0,0,Screen.width,Screen.height)); } //绘制帧动画 function DrawAnimation(tex : Object[], rect : Rect) { //绘制当前帧 GUI.DrawTexture(rect, tex[nowFrame], ScaleMode.StretchToFill, true, 0); //计算限制帧时间 time += Time.deltaTime; //超过限制帧则切换图片 if (time >= 1.0/fps) { nowFrame++; time = 0; if (nowFrame >= tex.Length) { nowFrame = 0; } } }
Unity3D入门之JavaScript的更多相关文章
- Unity3D入门之JavaScript动态创建对象
接着上一篇Unity3D入门文章,这里继续使用JavaScript脚本语言. 调试:Unity集成了MonoDevelop编辑器,在代码某行的左侧点击,即可下一个断点.然后先关闭Unity编辑器,在M ...
- [Unity3D入门]入门级游戏项目"坦克狙击手"更新
[Unity3D入门]入门级游戏项目"坦克狙击手"更新 在上一篇中我分享了一个尚未完全写好的入门级unity3d项目"坦克狙击手". 本文介绍最新版的" ...
- [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"
[Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...
- Unity3D 入门 游戏开发 Unity3D portal game development
Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...
- Unity3D入门其实很简单
在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D.本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位.不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3 ...
- Unity3D入门(一):环境搭建
1.Unity3D 目前最新正式版本是4.2.1f 官网下载,以前的版本安装时候需要序列号激活,新版本4.2.1f 不需要,完全免费,但发布的时候需要许可证 2.要学习的同学,下载频道可以找到破解补 ...
- Unity3D入门工具介绍(一)
1.UnitySetup-4.1.2.exe安装包 2unity.pro.4.1.2.patch-MPT.exeUnity3D破解补丁 关于Unity3d 可以看下这个 http://book.2c ...
- 创业笔记-Node.js入门之JavaScript与Node.js
JavaScript与Node.js JavaScript与你 抛开技术,我们先来聊聊你以及你和JavaScript的关系.本章的主要目的是想让你看看,对你而言是否有必要继续阅读后续章节的内容. 如果 ...
- HTML入门归纳--JavaScript
本人一直在从事.net的开发,界面都是采用的WPF,近期花了一个多月进行HTML前端的学习,在这里呢进行学习总结和归纳. 本系列将主要分为4个模块: 控件 样式 布局 JavaScript 根据多年W ...
随机推荐
- http://blog.csdn.net/xyang81/article/details/7292380
http://blog.csdn.net/xyang81/article/details/7292380
- 【mysql的设计与优化专题(4)】表的垂直拆分和水平拆分
垂直拆分 垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表 通常我们按以下原则进行垂直拆分: 把不常用的字段单独放在一张表; 把text,blob等大字段拆分出来放在附表中; 经常组合查询的 ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
- SSL构建单双向https认证
1. SSL基本介绍 我们常常在使用网上银行时看到的连接都是以“https”开始的,那么这个https是什么呢?这其实是表示目前连接使用了SSL进加密,能保证客户端到服务器端的通信都在被保护起来,那 ...
- WPF之外观模式
名词解释: 外观模式:为子系统中的一组接口提供一个一致的界面,此模式定义一个高层接口,这个接口使得这一子系统更加容易使用. 必要元素: 一个外观类和多个子系统类(外观类中注入各个子系统类). 上例子: ...
- IDirect3DDevice9::GetRenderTargetData
翻译自DXSDK 将渲染目标数据从设备内存拷贝到系统内存. HRESULT GetRenderTargetData( [in] IDirect3DSurface9 *pRenderTarget, ...
- 支付标记化(Tokenization)技术
道客巴巴->支付标记化(Tokenization)技术介绍 百度文库->中国银联支付标记化技术指引 NFC产业网->银联技术专家解答支付标记化Token技术 百度搜索->Tok ...
- python 简单示例说明os.walk和os.path.walk的不同
import os,os.path def func(arg,dirname,names): for filespath in names: print os.path.join(dirname,fi ...
- [置顶] Maven多模块项目 eclipse热部署 Maven项目实现 tomcat热部署 二
最近看到有好多童鞋比较热衷热部署,特别是多模块的项目,其实这热部署如果多模块比较大资源,容易内存溢出或者电脑卡住,并不建议这么做. 不过了解下也没有关系,这里我就在说说热部署的另外一种方法,因为我之前 ...
- Flex 选项卡加载方式简介
Flex中选项卡默认只加载选中的选项,所以在初始化的时候给其他的选项卡中的对象赋值或是其他操作,都会出现空对象错误. 解决办法:给选项卡设置属性 creationPolicy=”all” 如:< ...