【学习笔记】Unity3d学习笔记(一)

滚轮:放大缩小视图

鼠标右键移动:旋转视野(围绕焦点旋转视野)

鼠标左键:用来选择物体GameObject游戏物体

鼠标中键按下移动:用来平移视野

 

 

persp视图(透视视图)下

滚轮:放大缩小视图

鼠标右键移动:旋转视野(围绕当前视野位置旋转视野)

鼠标左键:用来选择物体GameObject游戏物体

鼠标中键按下移动:用来平移视野

 

Alt+鼠标左键:旋转视野(围绕焦点旋转视野)

Alt + 鼠标中键

Alt + 鼠标右键,进行视图的缩放

移动吸附:shift+Ctrl+鼠标移动

顶点吸附:(在表面顶点移动)按shift+v键激活,按鼠标左键移动,按shift+v键关闭定点吸附;

 

拖动物体按一个格子移动

   按住Ctrl键移动物体就会一个格子移动。

  按住Shift+箭头键加速移动

 

飞行模式(透视模式下):

   按住鼠标右键:

      W   Q   S    E  移动

 

在Hiararchy中选中物体

   按住 F 键使其成为场景中的中心

 

键盘中的箭头工具

    移动摄像机进行场景预览

 

渲染对比:

 

Unity中灯光类型:

    Spot   聚光灯 使用2D纹理

        设置光锥的角度

    Directional 方向灯光 平行方向 使用2D纹理

   Point  点灯光  灯光Cookies 使用立方盒贴图

    Area(baked only) 区域灯光,创建灯光贴图

            灯光的高度和角度

灯光在打开阴影效果Shadow会使用过多电脑资源

Draw Halo  灯光的光晕效果

Flare 灯光耀斑

Render  Mode  设置灯光重要性,Auto 自动根据设置变量和周围灯光 值进行调整

                                                 Impantant  Unity 会以每像素进行渲染

                                                 Not    impantant            顶点物体进行渲染

Culling Mark 通过层的方式,是灯光不影响此层中的物体

 

照相机:

     创建小地图,分屏

ClearFlags 摄像机渲染过程中的背景渲染

    Depth only 为场景中存在多个摄像机,设置渲染顺序产生叠加效果,只渲染颜色,不渲染深度

    Den't Clear 是每一帧叠加在上一帧上,既渲染颜色又渲染深度,形成拖尾效果

 

Culling Mask 选择渲染的层

Projetion设置当前摄像机

Field of view 摄像机视角

Normal View Port Rect 设置摄像头的拍摄视图尺寸大小

Depth  当深度值大 ,其渲染内容叠加在深度值小的摄像头渲染画面中

Rendering path  渲染路径

 

Target Texture 目标纹理

 

HDR打开摄像机的HDR效果

 

 

每一个物体都有一个纹理坐标

 

设置透明属性

    将materials 的shader 设置成mobile\Particles\Multipy粒子属性

刚体属性:rigidbody

         得到刚体组件调用刚体组件 rd = GetComponent<Rigidbody>();

         刚体可以控制物体移动;

start()//放置初始化代码

update()//放入命令并持续调用

 

transform.position+=new Vector3(0,0.01f,0);注释:往上运动根据世界坐标往上运动

transform.Translate(Vector3.up*Time.deltaTime);注释:往上运动,根据自己的坐标往上运动

transform.Translate(Vector3.up*Time.deltaTime,Space.World);注释:加第二个参数Space.Self,默认相对于自己改成相对与世界Space.World;

void FixedUpdate(){}有固定的时间间隔

从Start()中调用函数用StartCoroutine(函数名);

IEnumerator 函数名{yield return new WaitForSeconds(时间);注释:判断运行时间}

 

 

 

 

 

 

 

Yield语句是一种特殊类型的Return(返回语句),它可以确保函数在下一次执行时,不是从头开始,而是从Yield语句处开始。

 

 

 

 

Random随机数函数:

      var total = 0.0;

       for (elem in probs){

              total += elem;

       }

      var randomPoint = Random.value * total

       var i:int

     for (i=0;i< probs.Length; i++)

  {

        if(randomPoint < probs[i])

                     return I;

            else

                   randompoint -= probs[i];

   }

Return probs.Lenght - 1;

 

 

 

事件发送脚本

 

 

事件接受脚本

 

rd.AddForce()使加力括号内加向量

创建向量:new Vector3(x,y,z)

控制物体自身旋转:

transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime, Space.Self);

vector.up控制物体绕Y轴旋转;

rotateSpeed是速度控制;

Time.deltaTime

Space.Self自身旋转

控制旋转的另一种方法:

transform.Rotate(new Vector3(x,y,z));

修改UI中image的透明:

选择color属性,选择A的RGB大小;

 

碰撞器检测

            void OnCollisionEnter(Collision collision)

          {

                collision.collider获取碰撞到的游戏物体的collider组件

                       collision.collider.name获取碰撞到游戏物体的名字

                      string name = collision.collider.name;

                     print(name);//ptint 可以把一个字符差个你输出显示到控制台

                     if(collision.collider.tag =="takeup"){

                        Destroy(collision.collider.gameObject);

            }

触发器检测

              void OnTriggerEnter(Collider collider)

            {

                if (collider.tag == "takeup")

                        {

                          

                            Destroy(collider.gameObject);//Destroy是销毁所碰到的物体

                       

                    }

http://unity3d.com/unity/download/download-windows

 

 

                         score++;

                            text2.text = score.ToString();//定义命名为text2的UI中的Text类型的文本显示内容

                            if(score<26)

                               text1.text = (25-score).ToString();//强制转换

                            if (score == 25)

                            {

                                winText.SetActive(true); //使物体显示出来

                            }

 

脚本的使用,设置变量名可以使得脚本有重用性;

 

Private var 变量名(oneTexture) :Texture2D;注释:2D纹理类型

Private var 变量名(allTexture) :Object[];注释:物体数组类型

 

注释:Resources.Load()  Resources.AllLoad()需要专门的文件夹名

fuction OnGUI()

{

    if(GUI.Button(Rect(0,20,100,60),"loadOneTexture"))

{

     if(oneTexture==null){oneTexture=Resources.Load("oneTexture/Grass");}

}

     if(oneTexture!=null){GUI.DrawTexture(Rect(110,20,120,120),oneTexture,ScaleMode.StretchToFill,                true,                                       0);}

    绘制纹理的位置          纹理的名称       纹理缩放模式            是否打开阿尔法布兰科模式,存在此模式纹理将透明         定义纹理的宽高比例,定义为零是采用默认比例

if(GUI.Button(Rect(0,140,100,60),"loadAllTexture"))

{

     if(allTexture==null){oneTexture=Resources.LoadAll("allTexture");}

}

if(allTexture!=null){for(var i=0;i<allTexture.Length;i++){GUI.DrawTexture(Rect(110,20,120,120),oneTexture,ScaleMode.StretchToFill,true,0);}}

  

}

 

Movie纹理的格式:

 

 

 

 

 

 

声音文件:

   共同作用:

Audio source 音源组建  添加得到声音发出的物体上

Audio Listener 声音监听组建   添加到游戏中的角色物体中

 

 

#pragma strict

@script  RequireConponent(AudioSource)检测存在AudioSource组建

var bgAudio:AudioClip;注释:定义一个为音频的bgAudio名

   fuction Start(){audio.loop=true;}

   fuction OnGUI()负责图形的绘制

{

   if(GUILayout.Button("Play/Contine")){if(!audio.isPlaying){audio.Play();}}注释:开始播放的按钮

   if(GUILayout.Button("Pause")){audio.Pause();}注释:暂停播放的按钮

   if(GUILayout.Button("Play/Contine")){audio.Stop();}注释:停止播放按钮

   if(GUILayout.Button("PlayoneShort")){ audio.PlayOneShort(bgAudio,0.7)}注释:播放指定的音乐片段bgAudio.  0.7为音高可自己设定

}

 

 

预设:

    Prefab

运行实例化

     没有预设创建墙:

      #pragma strict

      fuction Start()

{

   for(var y=0;y<5;Y++)

   {

var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);注释:使用CreatePrimitive创建方块

cube.transform.localScale=Vector3(0.8,0.8,0.8);注释:设置缩放为0.8

cube.transform.position=Vector3(x,y,0);

   }

}

      fuction Update()

{

}

 

       有预设创建墙

#pragma strict

var 变量名(brick):Transform

fuction Start()

{

for(var y=0;y<5;y++){for(var x=0;x<5;x++){Instantiate(brick,Vector3(x,y,0),Quaternion.identity);}}

}

 

Debug.log("dfsl");//在控制台输出dfsl

   三种定位物体的方式:

1,定义一个变量,把物体拖入变量选项中

        2,通过 GameObject.Find("路径")//访问物体

3,通过标签访问物体

GameObject.FindGameObjectWithTag("标签名");

   对时间的使用:Time的属性

(1)deltaTime

上一帧

例子:改变灯光方位   light.Range=

(2)time

显示当前时间

(3)fixedTime

固定增量时间

(4)fixedDeltaTime

固定增量间隔时间

(5)smoothDeltaTime

平滑DeltaTime

(6)Yield语句

是一种特殊类型的Return(返回)语句,它可以确保函数

在下一次被执行是,不是从头开始,而是从Yield语句处开始

yield.WaitForSeconds(5.0);//使函数的执行延迟5秒

可以并行执行另一段语句;在延迟的时间段内。

    随机数的使用:Random

(1)Random.Value

可为一个变量赋值,值是0~1的数包含0和1

只返回浮点型

(2)Random.Range(M,N)

可为变量赋值,自定义赋值范围

类型为整型时只包含最小的范围值

类型为浮点型的最大和最小范围值都包含

变量名 = Random.Range(0,100);

赋值范围,要与变量的类型相对应

    物体消息传递:

GameObject.SendMessage:向自身的脚本中发送消息

GameObject.BroadcastMessage:向自身及子物体的脚本中发送消息

GameObject.SendMessageUpwards:向自身及父类物体中发送消息【先向自身发送再向其他发送】

gameObject.SendMessageUpwards("接收消息的函数名",附带消息中的传递类型,消息传递选项【可写可不写】);

接受消息的函数中数据类型要与附带消息中类型一致

 

C#中的消息传递:可以发送给多个物体,即所有监听此的物体

发送:

public delegate void EventHandler(GameObject e);【C#中的委托】

public event EnentHandler MouseOver;【C#中的事件】

void OnMouseOver(){

if (MouseOver != null)

{

MouseOver(this.gameObject);

}

}

接受:

void start(){

EventDispatcher【发送消息类的类名】 ev = GameObject.Find("物体名").GetComponent<EventDispatcher【发送消息类的类名】>();

ev.MouseOver += ListeningFunction;

}

void ListeningFunction(GameObject e){

this.transform.Rotate(20,0,0);

Debug.Log("mouse is over:"+e);

}

 

 

OnGUI 界面设计

必须定义一个OnGUI函数,所有的GUI 界面都在这给函数中编辑

                    Button:

GUI.Button(Rect(0,0,0,0)【前两个数字定义按钮位置,后两个数字定义按钮的高宽】,"按钮名称");

定义一个按钮是图片显示:

public Texture2D image;【定义GUI中的一个纹理变量】

GUI.Button(Rect(0,0,0,0)【前两个数字定义按钮位置,后两个数字定义按钮的高宽】,image);

再在Unity中为此image变量赋值;

定义一个按钮是图片加文字显示:

public Texture2D image;【定义GUI中的一个纹理变量】

GUI.Button(Rect(0,0,0,0)【前两个数字定义按钮位置,后两个数字定义按钮的高宽】,GUIContent("按钮名称",image));

再在Unity中为此image变量赋值;

定义GUI按钮提示:

GUI.Button(Rect(0,0,0,0)【前两个数字定义按钮位置,后两个数字定义按钮的高宽】,GUIContent("按钮名称","这是一个工具提示"));

GUI.Label (Rect(0,0,0,0)【位置大小】,GUI.tooltip)【GUI标签】

GUI.RepeatButton();

加Repeat可使Button按钮可持续执行,不加只是按一下执行一次

文本输入框控件

可以把输入的文本保存到一个变量中:

public string text;

text = GUI.TextField(Rect(0,0,0,0),text);

if(GUI.RepeatButton(Rect(0,0,0,0),text))

{ Write("jkdla");}【text:使在文本输入框中的文字显示在Button中】

      开关按钮:

选中时为开,未选中是为关;

public bool toggleBool = True;

toggleBool = GUI.Toggle(Rect(0,0,0,0),toggleBool,"Toggle");

水平滑块:

public float hSlidderValue;

hSliderValue = GUI.HorizontalSlider(Rect(0,0,0,0),      hSliderValue,      0,              10);

                                      滑动条的位置   滑动条上滑块的位置变量  滑动条的起始值 滑动条的终止值  

垂直滑动条与水平滑动条类似。

 

 

Box:

GUI.Box(Rect(0,0,0,0)【前两个数字定义按钮位置,后两个数字定义按钮的高宽】,"按钮名称");

复合控件的使用:

工具条控件:

定义两个变量记录工具条

public int toolbarint=0;

public string[] toolbarstrings={"工具按钮1","工具按钮2","工具按钮3"};

void OnGUI(){

toolbarint = GUI.Toolbar(Rect(0,0,0,0),toolbarint【打开时默认值】,toolbarStrings【根据数组长度定义工具条的数目】);                                                

}

网格控件:工具条控件的改版

定义两个变量记录网格

public int selectionGridint=0;

public string[] selectionstrings={"Grid1","Grid2","Grid3","Grid4","Grid5"};

void OnGUI(){

selectionGridint = GUI.SelectionGrid(Rect(0,0,0,0),selectionGridint【打开时默认值】,selectionStrings【根据数组长度定义工具条的数目】,2【定义显示的列数量,此时是两列】);                                                

}