2014-03-22 22:06:54 iteye_14994 阅读数 139

Unity3D学习笔记(四)天空、光晕和迷雾

转载自 http://huangxuyang.cn/unity3d/learning-unity3d-note-4

 

标签 Unity3D, 学习笔记, C#

六年前第一次接触《魔兽世界》的时候,被其绚丽的画面所折服,一个叫做贫瘠之地的地方,深深印在我的脑海里。当时在艾泽拉斯大陆还不能使用 飞行坐骑,试想一下孤身一人在银色的月光下赶路,可能还有你的战斗小伙伴,静谧的夜晚,皎洁的月光,一起走过了六年……即便是现在回想起来,浮现在脑海中 的不是T123456S123456,而是十字路口的星空。

wow

回到正题,在Unity中要创建这样的效果并不困难,用专业一点的术语讲就是只需要创建一个天空盒,并给予它天空纹理即可。通俗一点来讲,就是在我 们的前面几章创建的地形四周罩上一个立方体盒,并把盒子上面添上星空的照片就搞定了。有软件可以将魔兽世界的素材提取出来,然后加以利用到我们自己的游戏 中。不过这一章我并不准备讲述这些,因为主题是为了把天空盒和镜头光晕的知识点整理一下,如果有时间,我会另写一篇关于如何使用强大的"Wow Model Viewer"来导出魔兽世界的模型、贴图等素材,并导入到Unity中。其实具体操作并不困难,心急的朋友们可以去google code下载这个软件:http://code.google.com/p/wowmodelviewer/downloads/list

Unity自带了好几种天空盒,从白天到黄昏再到夜晚,拿来做场景练习已经完全够用了。要使用天空盒素材,只需要导入Skyboxes素材包即可 (至于如何导入可以参考我之前的笔记,每次都重复一遍略显蛋疼^_^)。导入成功后可以在项目资源面板的“Standard Assets->Skyboxes”目录下看到好多天空盒素材,Unity已经把盒子都造好了,我们直接拿来用就OK,非常人性化。

接下来要把天空盒素材添加到游戏场景里,有两种添加天空盒的方法,这里先写比较容易理解的一种,另外一种将在以后写预设和组件的时候再解释。点击主 菜单“Edit(编辑)->Render Settings(渲染设置)”,检视面板视图里就会出现渲染设置选项了,注意有个Skybox Material(天空盒材质)选项,点击它右边的小圆圈,就会弹出选择天空盒材质的对话框。单击任意一个材质球,设计视图中会立即提供预览,双击则表示 确认使用,相当便捷。

skybox

光这样是不够的,还记得之前添加的"线性光"吗?没错,就是那个“无限远、无限大类似于太阳的手电筒”^_^。它现在正静静地躺在层次面板中默默地 燃烧自己,照亮世界,它不叫雷锋,它的名字叫做Directional light。这个名字有点拗口,选中它并按快捷键F2修改,换成Sun,就把它当作游戏里的太阳。细心的朋友会发现,太阳光的方向和天空盒上那个假的太阳 的方向不一定会一致,可能导致太阳的位置和影子的位置有悖现实,所以必须手动调整,让它们重合。

这里提供一种便捷的方法,首先在设计视图中拖动视角,让镜头中心对准天空盒上的太阳,然后在渲染设置中临时将天空盒设置为无(为了方便调整Sun的 角度,否则天空盒太亮看不清楚)。然后选中Sun并使用旋转工具(快捷键E),将光线的方向正对自己,然后再将天空盒恢复即可。这样一来就不会闹太阳和影 子在同一个方向的笑话了。

rotation

玩过摄影的朋友应该都有这么个常识,当把镜头着阳光时,可能会出现一个或者多个七彩光环的光晕现象。百度一下光晕,发现全是关于某个游戏的@_@, 好不容易找到张照片,就委屈一下大妈您嘞。右上角就是传说中的光晕啦。导入Unity自带的素材包“Light Flares(闪光)”,选中线性光“Sun”,在Sun的检视面板中找到Flare属性,选择一个光晕图片(我选的是50 mm Zoom),当当当当~看看天上的太阳,是不是耀眼多了?

halo

halo2

 

完成光晕之后顺便把迷雾之类的设置也了解一下吧,所谓“欲穷千里目,更上一层楼”,放在当今城市里已经不太合适了。因为污染呀,各种细小的 粉尘漂浮在空气中,平时可能难以察觉,但是当举目远眺的时候就会发现远处根本就是一片迷茫嘛,跟大雾天一样的。在Unity的渲染设置中可以方便地调节这 种迷雾的效果,甚至可以改变颜色和浓度等等:

  • Fog(是否启用迷雾效果)
  • Fog Color(迷雾的颜色)
  • Fog Mode(迷雾模式):可以选择“Linear(线性)”、“Exponential(指数性)”、“Exp2(指数性2)”三种渲染模式,具体动手尝试一下即可,差别不是很大。
  • Fog Density(迷雾浓度)
  • Linear Fog Start(线性迷雾起始距离)
  • Linear Fog End(线性迷雾终止距离):当选择线性的迷雾模式时,这两个参数表示了相对于镜头的迷雾的范围。在这个范围内迷雾的浓度会被平均化,也就是说当范围很小的时候,远处的物体会很清晰,近处的物体反倒一点都看不见。
  • Ambient Light(环境光):调节这个颜色会影响到整个游戏场景的光线,比如调成粉红色的话……就好暧昧啊 哈哈。
  • Skybox Material(天空盒材质)
  • Halo Strength(光环强度,没弄明白)
  • Flare Strength(光晕强度)
  • Halo Textrue(光环贴图,没弄明白)
  • Spot Cookie(光斑?没弄明白)

halo sample

最后上张效果图,骄阳似火闷得慌啊哈哈~看来下一章非得加点水不可了:)

2013-04-12 19:54:32 fqlove 阅读数 4386

整理一下今天学习到的值的记录的东西

1.GUI字体设置

    嗯,这里面要写些什么呢?从Unity3d里只包含一个默认字体文件来说吧!Arial字体,对于中文的支持糟糕透了。所以,我们要自己指定GUI的Skin。这样整下GUI可以使用统一风格的GUI。

    首先导入要使用的字体,然后创建自已的GUI Skin文件mySkin。选中mySkin在左面列表中Inspector面板中的Font设置目标字体,如果在选择中没有目标字体,可以直接拖拽字体文件到该位置,下面如Box,Button等为单独设置每个GUI控件的样式。

    然后是在脚本中指定GUI的skin。可以用如下脚本:

    var mySkin:GUISkin;//声明皮肤变量,这样可以在运行界面中赋值

    关于如何在程序中对皮肤变量如何赋值,我不会,如有会的,请指教。

    function OnGUI()
{
 GUI.skin=mySkin;//指 定当前GUI的皮肤。下面就可创建按钮可Lable了。

}

这是统一设置的方式,那么,如何单独指定button或lable的字体或大小呢?这就用到了GUIStyle参数:

var GUI_style:GUIStyle=new GUIStyle();
 GUI_style.fontSize=24;
 GUI_style.normal.background = null;    //这是设置背景填充的
    GUI_style.normal.textColor=new Color(1,0,0);   //设置字体颜色的
    GUI_style.alignment=TextAnchor.MiddleCenter;   
    //GUI_style.border=2; 
 GUI.Label(Rect(150,50,Screen.width-300,50),title,GUI_style);

GUIStyle参数有很多的内容,可以多看看啊。

2.关于对象的半透明设置

本平是想让对象变成框线图的,但是没有找到,如果各位有相关的内容请指教。

下面是对半透明设置,只找到了这么一个方法,如果还有,请指教。

导入一张素材图片,然后拖拽到目标对象,对象会添加一个以素材名称命名的组件,Shader属性中选则Transparent/Diffuse,这样在下面的Color中就会有R,G,B,A四项,其中A就是对透明度的调整。在程序中我们可以通过gameObject.renderer.material.color.a对物体的透明度进行设置,值是0-1。

gameObject.renderer.material.color.a=0.2;//将透明度设置为0.2;

3.对于子对象的遍历

for(var child:Transform in transform)
  {
      Debug.Log(child.gameObject.name);
      child.gameObject.renderer.material.color.a=0.2;
  }

要提一句的是,Javascript中不支持foreach,但是其用法是一样的。

4.关于对象有Animation

设置Animation的Play Automatically为false,则在第一运行时不执行动画。

2018-03-27 22:04:30 Runner1st 阅读数 391

1、解释 游戏对象(GameObjects)和 资源(Assets)的区别与联系。

  • 游戏对象:出现在游戏场景中的实体,是一些资源的集合体,是资源整合的具体表现。
  • 资源:资源可以被多个对象利用,成为组件中的属性或者行为;还可以将游戏对象预设成资源,当做模板重复使用。

2、下载几个游戏案例,分别总结资源、对象组织的结构(指资源的目录组织结构与游戏对象树的层次结构)

  • 资源:一般包括脚本,声音,图像,预设,场景,材质等,在这些文件夹下可以继续划分
  • 游戏对象:一般包括玩家,敌人,环境,摄像机等虚拟父类,这些父类本身为空对象,但他们的子类包含了游戏中出现的对象。

3、编写一个代码,使用 debug 语句来验证 MonoBehaviour 基本行为或事件触发的条件

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

	void Awake () {
		Debug.Log ("onAwake");
	}
	// Use this for initialization
	void Start () {
		Debug.Log("onStart");
	}
	
	// Update is called once per frame
	void Update () {
		Debug.Log("onUpdate");
	}

	void FixedUpdate(){
		Debug.Log ("onFixedUpdate");
	}

	void LateUpdate(){
		Debug.Log ("onLateUpdate");
	}

	void OnGUI(){
		Debug.Log ("onGUI");
	}

	void OnDisable(){
		Debug.Log ("onDisable");
	}

	void OnEnable(){
		Debug.Log ("onEnable");
	}
}

4、查找脚本手册,了解 GameObject,Transform,Component 对象

  • 分别翻译官方对三个对象的描述(Description)

GameObject :GameObjects are the fundamental objects in Unity that represent characters, props and scenery. They do not accomplish much in themselves but they act as containers for Components, which implement the real functionality.

翻译:游戏对象是Unity中表示游戏角色,游戏道具和游戏场景的基本对象。它们自身无法完成许多功能,但是它们充当了那些给予他们实体功能的组件的容器。

Transform :The Transform component determines the Position, Rotation, and Scale of each object in the scene. Every GameObject has a Transform.

翻译: 转换组件决定了游戏场景中每个游戏对象的位置,旋转度和大小。每个游戏对象都有转换组件。

Component :Components are the nuts & bolts of objects and behaviors in a game. They are the functional pieces of every GameObject.

翻译: 组件是游戏中对象和行为的细节。它是每个游戏对象的功能部分。


  • 描述下图中 table 对象(实体)的属性、table 的 Transform 的属性、 table 的部件

本题目要求是把可视化图形编程界面与 Unity API 对应起来,当你在 Inspector 面板上每一个内容,应该知道对应 API。

例如:table 的对象是 GameObject,第一个选择框是 activeSelf 属性。

答:table对象的属性:activeInHierarchy(表示GameObject是否在场景中处于active状态)、activeSelf(GameObject的本地活动状态)、isStatic(仅编辑器API,指定游戏对象是否为静态)、layer(游戏对象所在的图层。图层的范围为[0 … 31])、scene(游戏对象所属的场景)、tag(游戏对象的标签)、transform(附加到这个GameObject的转换)

table的Transform的属性:Position、Rotation、Scale,从文档中可以了解更多关于Transform的属性

table的部件有:Mesh Filter、Box Collider、Mesh Renderer

  • 用 UML 图描述 三者的关系(请使用 UMLet 14.1.1 stand-alone版本出图)

5、整理相关学习资料,编写简单代码验证以下技术的实现:

  • 查找对象
//通过名字查找:
public static GameObject Find(string name)  
//通过标签查找单个对象:
public static GameObject FindWithTag(string tag)  
//通过标签查找多个对象:
public static GameObject[] FindGameObjectsWithTag(string tag)  
  • 添加子对象
public static GameObject CreatePrimitive(PrimitiveTypetype)  
  • 遍历对象树
foreach (Transform child in transform) {  
    Debug.Log(child.gameObject.name);  
}  
  • 清除所有子对象
foreach (Transform child in transform) {  
    Destroy(child.gameObject);  
} 

6、资源预设(Prefabs)与 对象克隆 (clone)

  • 预设(Prefabs)有什么好处?

预设相当于一个对象的模板,当某个对象需要重复出现时,用预设可以提高效率,方便管理。预设使得修改的复杂度降低,一旦需要修改所有相同属性的对象,只需要修改预设即可,所有通过预设实例化的对象都会做出相应变化。


  • 预设与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?

修改预设会使通过预设实例化的所有对象都做出相应变化,而对象克隆本体和克隆出的对象是不相影响的。


  • 制作 table 预制,写一段代码将 table 预制资源实例化成游戏对象
    void Start () {  
        GameObject anotherTable = (GameObject)Instantiate(table.gameObject);  
    } 

7、尝试解释组合模式(Composite Pattern / 一种设计模式)。

将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口,这就是组合模式能够将组合对象和简单对象进行一致处理的原因。


  • 使用 BroadcastMessage() 方法向子对象发送消息

    父对象方法:

public class NewBehaviourScript : MonoBehaviour {
    void message() {
        Debug.Log("HelloWorld!");
    }
    void Start () {
        this.BroadcastMessage("message");
    }
}

    子对象方法:

public class NewBehaviourScript1 : MonoBehaviour {
    void message() {
        Debug.Log("HelloWorld!");
    }
}

2017-03-05 20:45:09 d4snap 阅读数 1227

Unity3d学习笔记1——基础概念了解

目录


解释对象与资源的区别与联系,根据官方案例,分别总结资源和对象组织的规则/规律

-资源 我的理解是指文件,存储在硬盘中。比如材质、贴图、纹理等等。可以实例化为对象,可以被对象使用。从资源到对象,要经过一个过程,如序列化与反序列化一般。
- 对象 我认为是指unity使用中的某些被加载进入内存的数据资源。不仅仅限于玩家,背景,等。
- 资源和对象的关系,并不一定是一一映射,所以会有使用一个资源创建多个对象,这样对于内存等会有一定减轻压力。

编写简单程序代码,逐一验证 MonoBehaviour 基本行为触发的条件

  • OnAwake 方法: 当脚本实例被载入时Awake被调用。
  • OnStart 方法: Start函数仅调用一次,而且是在Update函数第一次被调用之前调用。
  • OnUpdate 方法 :每一帧被调用一次。这里是大部分游戏行为代码被执行的地方,除了某些定时代码。
  • OnGUI 方法: 渲染和处理GUI相关事件时调用
  • FixedUpdate 方法: 这个函数在每个特定时间内会被调用一次。这是处理基于现实游戏行为的地方。
  • LateUpdate 方法 :是在所有Update函数调用后被调用。可以用来实现一些特殊的功能。可以理解为它在下一轮update执行前执行。
  • Reset 方法 : 重置为默认值
  • OnDisable 方法: 对象变为active false状态时此函数被调用。
  • OnDestroy 方法:当MonoBehaviour将被销毁时,这个函数将被调用
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour {

    void Awake() {
        Debug.Log("onAwake!");
    }
    void Start() {
        Debug.Log("onStart!");
    }
    void Update() {
        Debug.Log("onUpdate!");
    }
    void OnGUI() {
        Debug.Log("onGUI!");
    }
    void FixedUpdate() {
        Debug.Log("onFixedUpdate!");
    }
    void LateUpdate() {
        Debug.Log("onLateUpdate!");
    }
    void Reset() {
        Debug.Log("onReset!");
    }
    void OnDisable() {
        Debug.Log("onDisable!");
    }
    void OnDestroy() {
        Debug.Log("onDestroy!");
    }
}

这里写图片描述

通过官方参考手册,查找 GameObject,Transform,Component 对象,简单解释三者之间的关系。

  • GameObjects are the fundamental objects in Unity that represent characters, props and scenery. They do not accomplish much in themselves but they act as containers for Components, which implement the real functionality.
  • 根据官方文档的解释,GameObject就说最基本的对象,而很多特殊的功能其实是要靠挂载的Components组件来实现。
  • A GameObject contains components.
  • 组件是被GameObject包含的。
  • The Transform component determines the Position, Rotation, and Scale of each object in the scene. Every GameObject has a Transform.
  • Transform是一种组件,确定位置旋转缩放等,每个GamaObject都会有一个Transform组件。

整理官方和其他学习材料,介绍如何用程序(代码)管理一个场景的游戏对象树林。编写简单代码验证以下技术的实现:查找对象、添加子对象、遍历对象树、清除所有子对象

查找对象
通过名字查找:public static GameObject Find(string name)
通过标签查找单个对象:public static GameObject FindWithTag(string tag)
通过标签查找多个对象:public static GameObject[] FindGameObjectsWithTag(string tag)

添加子对象
public static GameObect CreatePrimitive(PrimitiveTypetype)

遍历对象树
foreach (Transform child in transform) {
Debug.Log(child.gameObject.name);
}

清除所有子对象
foreach (Transform child in transform) {
Destroy(child.gameObject);
}

预设有什么好处?与对象克隆 (clone or copy or Instantiate of Unity Object) 关系?

  • 预设体,可以节约资源,他是可以反复利用的游戏对象,可以应用于多个场景,亦或在一个场景中多次使用。预设的使用,就是很大程度上减少了重复的工作。
  • 对与对象克隆,预设体可以保证所有的实体,都是预设体的克隆,而且预设体的修改会改变所有实例。

解释组合模式。并编写验证程序,向组合对象中子对象 cast 消息, 验证组合模式的优点

  • 组合模式:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象。

Unity3D 学习笔记

阅读数 8

没有更多推荐了,返回首页