签到

05月05日
尚未签到

共有回帖数 2

    晚街听风

    等级:
    学习U3D也有一段时间了,个人在学习的时候喜欢做一些笔记,写一些心得体会,回过头来看的时候才发现由于当时是从零开始的,所以写的比较细致,希望能对还在门槛阶段的U3D新手有一些帮助~
    Unity3D学习01
    一:Assets文件夹下应该包含的文件夹:
    Materails(材质,材质球),profabs(预组件),textures(纹理,贴图),model(模型,模型导入时也许会自带材质,纹理文件夹,所以一个好习惯就是为每一个导入的模型都建一个单独的文件夹),script(脚本)。

    二:一个功能强大的材质制作软件:SubstanceDesigner
    文件格式:.sbsar
    导入方法:直接导入(前提:在Substance Designer官网下载材质浏览器)
    .sbsar格式材质球在文件夹中直接拖动赋给模型是不行的,要先选中材质球,然后到Inspector面板下拖动才可以

    三:创建预组件:
    先在场景中创建想要的预组件,然后在Hierarchy面板中新建分组(见八),将预组件的物体放入新建组,在profabs文件夹新建profab,然后将Hierarchy面板中的新建组整个拖入新建的profab即可。

    四:ctrl+D复制一个对象,选中对象时按下V,可粘合两个对象

    五:为对象加物理模型:
    选中对象-compoment-physics
    1.Rigibbody(刚体): 可附加重力属性,设置物体重量(mass),物体受外力影响后可
    移动的距离(drag)。Is Kinematic(动态属性)选项表示是否为物体附加动画,如一扇可被打开的门,勾选后物体将不会受重力等外力影响直到另外一个刚体触碰到它。
    2.各种Collider(碰撞器):对应各种形状的碰撞器,形状大小可调,Mesh(网格)碰撞器
    可做出符合物体外形的碰撞器,但消耗资源较大。碰撞器形
    状将影响物体的运动状态,如球形的可以滚动,立方体可以
    堆砌等等。(各种形状的碰撞器可进行叠加以实现复杂形状
    的碰撞器)

    六:添加预制的摄像机模型:
    在assets文件夹下右键-import package-character controller-import
    然后在对应文件夹中将模型(第一人称或第三人称)拖入即可。

    七:创建地形:
    在Hierarchy窗口点击create-terrain即可,默认terrain自带terraincollider,可在terrain(script)选项中对地形进行绘制以及相应的设置(贴图纹理等)。
    在画笔选项中,可以设置Textures,这样在绘制地形时会自动为地形赋予挡前设置的textures。

    八:管理Hierarchy面板:
    有时候加入到场景中的物体太多了,Hierarchy面板会显得很乱,这时候可以:
    GameObject-Create Empty来在Hierarchy面板中创建一个新的分组,然后可以将属性相近的物体放进同一个分组,以便于管理。

    九:创建光源:
    GameObject-Create Other下对应有四种不同的光源;
    1.Directional light(平行光,类似于太阳光)
    2.Point light(点光源,类似于电灯泡)
    3.Spotlight(聚光,类似于手电筒)
    4.Area light(面光,可在一个位置照亮面对它的一切物体)

    两种方法创建光源:
    1.直接创建
    2.将光源绑定到指定物体上,比如电灯泡:
    选中物体,Add Component-Rendering(渲染)-Light
    可在Light选项中调节相关属性(如亮度,颜色,范围等,还可以直接在type选项处更改light的类型,在shadow type选项,可以调节影子相关的设置)

    调节阴影时可能会出现警告,相关选项在:Edit-ProjectSettings-player-Other settings-Rendering path(渲染路径),对应三种选项,选择Deferred lighting(延迟光)就可以使用阴影了。
    Unity3D学习02
    一:创建粒子效果:
    在Hierarchy面板中,Create-Particle System
    在Assets文件夹内右键-Import Package-Particle导入粒子效果包
    在Hierarchy面板中选中Particle System后,可在Inspectors面板中修改粒子系统的相关参数,来达到不同的粒子效果:

    Max Particle:最大生成粒子数量
    Prewarm(预热):勾选后,在载入场景之前粒子系统就可以预先生成
    Start Lifetime:表示每个粒子可持续的时间,单位:秒
    Start Speed:表示粒子运动的速度
    Start Size:粒子的大小

    1.Emission:
    Rate:粒子密度
    2.shape(形状):
    在这里可以调节粒子系统的形状,大小,这里的形状大小指的是整个粒子系统在场景中所覆盖的面积。还可以勾选Random Direction项让粒子的生成方向成随机形式。
    3.Size over Lifetime:
    调整粒子在生成到消失时间段内大小的变化。
    4.Renderer(渲染器):
    调节粒子的材质,可直接用之前导入的粒子效果包来设置。

    二:脚本:
    1.Start()函数只在游戏开始时执行一次
    Update()函数在每一帧执行一次
    2.随机出生点函数
    在Hierarchy面板新建一个GameObject,将它放到场景中,一个GameObject代表一个出生点,选中新建的GameObject,在Inspector面板中点击Tag项,tag是一个标签性的属性,默认的没有出生点,所以点击Add tag,在Element0选项后命名即可新建一个tag了。在语言编辑器中可以通过tag名来控制出生点。
    实现方法是:随机生成一个数字,通过这个数字来在定义好出生点tag的地方选出出生点,其实就是那些空的GameObject,然后将这个出生点的坐标赋值给我们的Player就可以了。

    三:创建HUD显示界面(显示角色反馈信息):
    1.创建一个空的GameObject来装载HUD素材和脚本;
    2.导入素材(tga,jpg等),选中素材,在Inspector面板的Texturetype选项选GUI,点击Apply确认更改;
    3.选中新建GameObject,Add Component-GUITexture,这一步将GameObject中导入的素材锁定在主相机上;
    4.在GUITexture选项的Texture中,可以看到刚刚设定为GUI的素材了,选中一个后就可以在主相机上看到导入的素材了。在Transform选项中,可以调整素材在画面中的位置,在pixel Inset选项中,可以调整素材的大小(??);
    5.写更换素材的脚本:
    Public Texture2D[] HUD_texture; //在这里创建了一个数组用来存放我们要导入的素材,数组的大小可以在Inspector面板进行设置,设置完size后,可以分别为数组的每一个成员导入素材,真是太方便了。
    Public GUITexture HUDTexture;//创建一个GUITexture的变量,他可以给GUI的Texture赋值,赋值对象可以在Inspector面板进行设置,我们设置为刚刚建好的Add了GUI的GameObject就可以了。
    剩下的只用按一定规则给GUITexture.texture赋值为HUD_texture中的一个就可以了。

    这样可以实现血条,物品等信息,碉堡了。
    四:创建物品拾取系统:
    1.导入可拾取物体
    2.写脚本:
    Viod OnTriggerEnter(Collider player)//unity3d自带的的函数,两个有碰撞器的物
    体相撞时才触发
    {
    Play.gameObject.SendMessage("XXXXXX");//XXXXX代表你想触发的函数,比
    如上面写的HUD更换素材函数等等。
    Destroy(this.gameOject);//删除物体
    }
    3.注意,要给物体加碰撞器,并且选上trigger项。
    Unity3D学习03
    一:控制灯光的脚本:
    Public Light aLight;
    aLight = GameObject.Find("有灯光的一个物体名字").GetComponentLight();
    //以上代码可以将代码信息传递给这个物体的光组件。
    aLight.light.intensity = 一个小于8的float数;//这样就可以控制灯组件的亮度了。
    注意,这样写完以后,在Inspector面板的选项处就不能为aLight设置目标了,否则会报错;

    二:定时器:
    Public float Max =10.0f;//定义一个最大的时间

    Void Update()//在每一帧检测
    {
    if(max  0.0f)
    {
    Max -= Time.deltaTime;
    }
    Else
    {
    Max=10.0f;
    …………
    }
    }//每隔max时间执行else中代码;
    Unity3D体会01
    一:可在物体上加粒子效果实现好玩的又实用的效果,如火焰加烟雾效果


    二:在物体上绑定灯光,达到有趣的效果,如带梦幻效果的树


    三:同一个模型在场景中重复使用的话可以通过改变大小,调整方向来避免单一。
    四:自带的水面效果碉堡了,在素材文件夹右键导入包,选water(only pro),两种水
    面,带反射效果


    五:选中地形后,第五个选项可以批量在地形上种上树,当然,将树的模型换成其他物体也同样可以批量的附到地形上,方便极了。


    六:在水底用粒子系统制作气泡从水底冒起的感觉


    七:自带的地形素材:
    素材文件夹右键导入包,选terrain。自带的一些贴图什么的还挺好用。居然还有一棵树…


    八:两种方法导入天空盒子:
    1.向摄像机里导入:

    2.向场景中导入:

    在场景中导入任何时候都可以看到,在摄像机中导入只能在该摄像机中看到。
    在场景中导入时,可以勾选fog(雾)选项来设置雾气效果。在Ambient light选项中选择光的颜色可以调出各种时段的光照场景。如黑夜:


    九:玻璃效果:
    自带玻璃效果:素材文件夹右键导入包,选Glass Refraction(pro),打开后将mat文件直接拖到物体上即可实现物体的玻璃化效果,最好是一个面。
    Unity3D学习04
    一:键盘事件的获取
    1.按下事件:
    Input.GetKeyDown();//如果按下按键,返回ture,否则返回false
    例如:
    If(input.GetKeyDown(KeyCode.A))
    {
    Debug.log("按下了A键");
    }
    2.拾起事件:
    Input.GetKeyUp();//如果抬起了按键,返回ture
    例如:
    If(input.GetKeyUp(KeyCode.A))
    {
    Debug.log("抬起了A键");
    }
    3.长按事件:
    Input.GetKey();
    例如:
    Int num=0;
    If(input.GetKey(KeyCode.A))
    {
    num++;
    Debug.log("A被连按了"+num+"次");
    }

    二:载入新场景
    例如一个碰撞器触发的载入新场景:
    Void OnTriggerEnter(collider player)
    {
    Application.LoadLevel("场景名字");
    }

    三:导出游戏到特定的平台
    1.file-buildsetting
    2.将已建好的场景拖入scenes inbuild窗口实现添加,注意场景排序。
    3.点击player setting按钮,在Inspector面板设置游戏基本信息,如:公司名字,游戏名字,游戏图标。在per-Platform Setting选项中,保证对应平台正确,对于pc,可以调节分辨率,品质,全屏与否等等。
    4.点击build and run或者build保存exe文件即可…

    四:烘培光照贴图
    1.设置静态物体,告诉系统场景中哪些物体是静态的。
    选中物体,在Inspector面板中勾选static即可。
    2.windows-lightmapping(光照贴图)
    在object选项中选择烘培起作用的物体。
    在bake选项中:Mode中,选择DualLightmaps系统会创建出远景和近景两层光照贴图;移动平台低效果游戏可以选Use in forward rend选项;在最下面可以设置天空光线。
    在maps选项:添加light probes(光线探测器),可以采集场景中的光线信息并应用到动态物体上。
    创建空物体,选中该物体,Addcomponent-rendering-light probes
    然后Add Probe,将探测器布置到场景中即可,探测器布置的越多,采样效果越好。
    回到maps选项,bake probes将探测器烘培到场景中,然后回到object选项,将bakeprobes改为bake scene。

    烘培结束后删除场景中的光源。
    要想探测器对动态物体生效,对于动态物体,要选中use light probes选项。

    五:动画制作
    Ctrl+6或windows-Animation打开动画编辑窗口,在资源文件夹内新建储存动画的文件夹Animation,选中物体,点击小红点,就可以录制动画了;

    六:动画控制(同一角色不同状态触发不同动画)
    1.在3ds max里创建动画,导出FBX格式文件,命名规则: 物体名@动画名
    2.在unity3d素材文件夹导入FBX文件,设置rig为legacy;
    3.将模型拖入场景中,在Animations选项中设置size为需要导入的动画片段数,在下面依次导入动画片段。
    4.写脚本:
    animation.wrapMode = WrapMode.Loop; //设置所有动画为循环播放,还有其他方式可设置;
    播放动画代码为:
    animation.play("动画名"); //没有任何过度的播放一个动画;
    animation.CrossFade("动画名"); //自动的从正在播放的动画平滑的切换到指定的动画;
    Unity3D学习05
    一:控制动画播放速度
    animation["动画名"].speed = 2; //将指定动画播放速度变为默认的2倍

    二:为物体施加力
    1.前提:物体为刚体属性
    2.脚本:
    Rigidbody bridbody;
    bridbody = GameObject.GetComponentRigidbody();

    bridbody.AddForce(new Vector(x,y,z));//注意,Vector在用时要new一下
    还可以:
    bridbody.AddForce(Vector3.up*10);
    //Vector3.up*10相当于Vector(0,10,10)

    三:移动物体:
    transform.Translate(Vector3.up*Time.deltaTime*0.1f);//让物体向上移动,后面的表示速度

    四:隐藏和显示物体
    gameObject.renderer.enabled =true/false;//不能隐藏子物体
    gameObject.SetActiveRecursively(true/false);//相当于改变Inspector面板最上面的那个勾。
    注意:若要对一个物体用SetActive实施隐藏后再使其出现,必须保证其所有父物体的active属性为true。可以建一个空物体作为要执行隐藏和显示物体的父物体。
    Unity3D学习06
    一:GUIText的添加
    新建一个空物体,给它添加组件GUIText,然后设置一些基本参数。
    在脚本中,通过:
    GUIText text01;
    text01 = GameObject.Find("空物体的名字").GetComponentGUIText();
    text01.text = "你想显示的字"+一个数等等;
    NGUI学习01
    一:Panel面板
    1.分层,NGUI中每层可有多个空件
    2.创建Panel:
    NGUI-Open-UI Wizard-在Layer选项中选择层,在Camera选项中选择摄像机,创建成功
    3.为Panel添加脚本:
    新建空的物体放到panel下,为空物体添加panel脚本组件即可
    然后就可以在这个panel下添加控件了

    二:Label文本栏
    1.在panel中添加Label控件
    2.在属性面板调节相应属性

    三:消息机制
    1.直接将脚本附在按钮上,如button按钮,在脚本中实现OnClick()即可响应单击事件
    2.使用SendMassage,为按钮添加Button Massage组件,设置Target,Function Name,Trigger,Include Children即可响应trigger事件,然后调用Target对象的Function方法。
    3.使用UIListener,为按钮添加Event Listener组件。然后再任何一个脚本中即可得到该按钮的点击事件,得到方法为:
    Void Awake()
    {
    GameObject button = GameObject.Find("这个按钮");
    UIEventListener.Get(button).OnClick = 你想调用的方法名字,假如说为a;
    }

    Void a(GameObject button)
    {
    ………
    }
    Unity学习07
    一:绘制线段:
    为物体添加linerendenerer组件,在脚本中获得该组件的引用后,增加position数组大小,设置position数组数值即可绘制折线。
    在脚本中获取了Linerenderer组件后,可以使用
    linerenderer.SetVertexCount (int numberOfPosition);
    方法动态的为position的size赋值,
    然后使用
    linerenderer.SetPosition (int index, vector3 newPosition));
    方法为第index个position赋值 ,达到扩展线条的效果。

    二:脚本拷贝物体(prefab与instantiate)
    1.获得要拷贝prefab的引用
    GameObject wuti = GameObject.Find("要拷贝的预组件");
    2.用instantiate拷贝
    Instantiate(wuti, position, rotation);//将wuti拷贝到position位置,角度为rotation
    3.使用局部坐标实现对较为规则的物体的描边
    Unity3D学习08
    一:unity3d调用windows的资源管理器:
    1.项目Assets文件夹新建Plugins文件夹,放入System.Windows.Forms.dll文件
    2.脚本中using System.Windows.Forms;
    3.代码如下:
    public voidLoadMap()
    {
    WWWwww_map;

    OpenFileDialogchoiceWindow = new OpenFileDialog ();
    choiceWindow.Title = "请选择载入地图";
    choiceWindow.Filter = "图片文件(*.jpg,*.png,*.bmp)|*.jpg;*.png;*.bmp";
    choiceWindow.InitialDirectory= UnityEngine.Application.dataPath + @"/map";
    choiceWindow.RestoreDirectory= true;

    if(choiceWindow.ShowDialog()== DialogResult.OK)
    {
    www_map= new WWW("file://" + choiceWindow.FileName);
    gameObject.renderer.materials[0].SetTexture(0,www_map.texture);
    }
    }
    代码功能:打开资源管理器窗口,选中一副图片,并将图片作为gameobject的材质贴图。
    一:鼠标射线
    1.Ray clickRay;//Ray代表发出的射线
    RaycastHitclickHit;//RaycastHit储存一系列射线与物体碰撞的信息
    clickRay =Camera.main.ScreenPointToRay(Input.mousePosition);
    //指定发射射线的摄像机为主摄像机,获取当前鼠标屏幕坐标并将其转换成射线。
    Physics.Raycast(clickRay, out clickHit);
    //将clickRay的信息储存到clickHit中。
    //也可当做判断条件是否发生碰撞如:if(Physics.Raycast(clickRay,out clickHit)){…}

    以下是当时在网上淘的鼠标射线的知识,很有用处,先贴在这里让大家分享~


    射线:射线是3D世界中一个点向一个方向发射的一条无终点的线,在发射轨迹中与其他物体发生碰撞时,它将停止发射 。
    用途:射线应用范围比较广, 多用于碰撞检测(如:子弹飞行是否击中目标)、角色移动等 等。

    相关API:

    1、Ray Camera.main.ScreenPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到屏幕指定一个点
    2、Ray Camera.main.ViewportPointToRay(Vector3 pos) 返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
    3、Ray 射线类
    4、RaycastHit 光线投射碰撞信息
    5、bool Physics.Raycast(Vector3 origin, Vector3 direction, float distance, int layerMask)
    当光线投射与任何碰撞器交叉时为真,否则为假。
    bool Physics.Raycast(Ray ray, Vector3 direction, RaycastHit out hit, float distance, int layerMask)
    在场景中投下可与所有碰撞器碰撞的一条光线,并返回碰撞的细节信息()。
    bool Physics.Raycast(Ray ray, float distance, int layerMask)
    当光线投射与任何碰撞器交叉时为真,否则为假。
    bool Physics.Raycast(Vector3 origin, Vector3 direction, RaycastHit out hit,float distance, int layerMask)
    当光线投射与任何碰撞器交叉时为真,否则为假。

    注意:如果从一个球型体的内部到外部用光线投射,返回为假。
    参数理解:
    origin : 在世界坐标中射线的起始点
    direction: 射线的方向
    distance: 射线的长度
    hit: 使用c#中out关键字传入一个空的碰撞信息类,然后碰撞后赋值。可以得到碰撞物体的transform,rigidbody,point等信息。
    layerMask: 只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞
    6、RaycastHit[] RaycastAll(Ray ray, float distance, int layerMask)
    投射一条光线并返回所有碰撞,也就是投射光线并返回一个RaycastHit[]结构体。

    楼主 2015-07-07 17:29 回复

共有回帖数 2
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知