刚刚接触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的更多相关文章

  1. Unity3D入门之JavaScript动态创建对象

    接着上一篇Unity3D入门文章,这里继续使用JavaScript脚本语言. 调试:Unity集成了MonoDevelop编辑器,在代码某行的左侧点击,即可下一个断点.然后先关闭Unity编辑器,在M ...

  2. [Unity3D入门]入门级游戏项目"坦克狙击手"更新

    [Unity3D入门]入门级游戏项目"坦克狙击手"更新 在上一篇中我分享了一个尚未完全写好的入门级unity3d项目"坦克狙击手". 本文介绍最新版的" ...

  3. [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手"

    [Unity3D入门]分享一个自制的入门级游戏项目"坦克狙击手" 我在学Unity3D,TankSniper(坦克狙击手)这个项目是用来练手的.游戏玩法来自这里(http://ww ...

  4. Unity3D 入门 游戏开发 Unity3D portal game development

    Unity3D 入门 游戏开发 Unity3D portal game development 作者:韩梦飞沙 Author:han_meng_fei_sha 邮箱:313134555@qq.com ...

  5. Unity3D入门其实很简单

    在上次发布拙作后,有不少童鞋询问本人如何学习Unity3D.本人自知作为一名刚入门的菜鸟,实在没有资格谈论这么高大上的话题,生怕误导了各位.不过思来想去,决定还是写一些自己的经验,如果能给想要入门U3 ...

  6. Unity3D入门(一):环境搭建

    1.Unity3D 目前最新正式版本是4.2.1f  官网下载,以前的版本安装时候需要序列号激活,新版本4.2.1f 不需要,完全免费,但发布的时候需要许可证 2.要学习的同学,下载频道可以找到破解补 ...

  7. Unity3D入门工具介绍(一)

    1.UnitySetup-4.1.2.exe安装包 2unity.pro.4.1.2.patch-MPT.exeUnity3D破解补丁  关于Unity3d 可以看下这个 http://book.2c ...

  8. 创业笔记-Node.js入门之JavaScript与Node.js

    JavaScript与Node.js JavaScript与你 抛开技术,我们先来聊聊你以及你和JavaScript的关系.本章的主要目的是想让你看看,对你而言是否有必要继续阅读后续章节的内容. 如果 ...

  9. HTML入门归纳--JavaScript

    本人一直在从事.net的开发,界面都是采用的WPF,近期花了一个多月进行HTML前端的学习,在这里呢进行学习总结和归纳. 本系列将主要分为4个模块: 控件 样式 布局 JavaScript 根据多年W ...

随机推荐

  1. Android名词解释

    System Bars.Status Bar.Navigation Bar System Bars-->the Status bars and Navigation bars.

  2. spark storage之SparkEnv

    此文旨在对spark storage模块进行分析,整理自己所看所得,等以后再整理. ok,首先看看SparkContext中sparkEnv相关代码: private[spark] def creat ...

  3. DJANGO和UIKIT结合,作一个有进度条的无刷新上传功能

    以前作的上传,在糙了,所以在用户体验上改进一下. 同时,结合DJANGO作定位上传. 这其中分两步进行,第一次上传到TMP目录下, 第二次,将TMP下的文件转移到标准目录下. form.py file ...

  4. POJ1328——Radar Installation

    Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side ...

  5. LCMS

    LCMS(LearningContent Management System) 即学习内容管理系统

  6. Android 解析XML

    public void getXML(String url) throws XmlPullParserException,IOException,URISyntaxException { String ...

  7. PHP的(Thread Safe与Non Thread Safe)

    在安装xdebug到时候你会有有TS和NTS版本的选择,在以前还有VC6和VC9的版本.如果你没有根据你目前的服务器的状况选择对应的版本的话,那么xdebug是安装不成功的. 一.如何选择 php5. ...

  8. 用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收

    消费者:接收消息 逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 <?php /********* ...

  9. Git教程(8)Git几种工作方式

    1,集中共享式(1个仓库) 其中角色: 1个远程仓库,N个开发者. 工作方式: 集中式系统:所有开发者共享同一个远程仓库.每次推送数据到远程仓库时都要先更新一下. 利用 Git 的分支模型,通过同时在 ...

  10. Eclipse下Preferences解析

    General列表下: Keys设置快捷键 Appearance->Colors and Fonts->Text-Font设置字体和大小 Appearance->Startup an ...