Unity3D基础入门学习笔记01
本系列学习视频——[傅老師/Unity教學] Unity3D基礎入門
1 installation
创建一个全新的项目
得到视窗,选择右上角的layout可以更改布局
安装MonoDevelop确保可以用,点选edit→preferences,勾选MonoDevelop,可以新建c#文件然后由MonoDevelop打开
2 window
shift+空格——使scene view最大化
project栏位和文件夹的状态一致
3 move yourself
4 move other objects
操作练习——台阶
5 primatives
按住ctrl移动,在格线上面移动,摆出这几个基本元件看看。
6-7 materials
albedo——反射率贴图,主要体现模型的纹理和颜色
tilling——重复次数
offset——偏移量
metallic——金属度
smoothness——平滑度(看着粗不粗糙)
normal——法线贴图
在网上搜一下freepbr的材质,导入法线贴图
但是看到边缘还是平的,所以这也体现了法线贴图
8 skybox
下载一个天空盒进行应用,十字天空条,或者是新建材质里选hdri
9 Material and skybox
只剩一个球体,应用白色的材质球,打开window→light→setting
smooth调到最高会看到反射,但是这个反射只是环境的反射,resolution为分辨率,compression为是否压缩,老显卡可能会压缩失败
intensity multip为这个反射的权重,bounces为反射次数
也可以选择custom,选择另一个天空盒材质来反射
如果想要反射信息,可以在create→light→reflection probe(以后再说)
自带天空盒的sun source
环境光原本是skybox,可以设置成ambient color以及其他的的东西
设置成gradient的话,可以设置天顶,赤道,以及地面的颜色
metallic实际上调整一个权重,调整上述提到的环境光和反射光的比例
10 add floor
可以到这里下载素材,随意找到一个
下载albedo和normal,导入,通常会设置这几个
normal贴图要改type
但是还是假假的,所以还要上AO贴图 环境光遮蔽(Ambient Occlusion),它的原理是通过将褶皱、孔洞和非常靠近的墙面变暗的方法近似模拟出间接光照
我们还会用到高度图 height map
手机上最常见就上一张albedo或者加上normal,因为会影响性能
我们可以再下一张Roughness贴图
我们记得之前有过一个smoothness的选项,这和roughness有什么关系呢
smoothness的贴图信息,要么从metallic alpha去取,要么从albedo alpha去取(为了省一个贴图)
我们下载完roughness的图之后,开gimp处理,进行颜色翻转
为了塞到metallic的alpha通道里,我们新建一个metallic贴图,操作见视频p10
11 add player
在asset store里搜索unity chan(不过要2018以上的版本,所以就去下了2019的unity)
下载之后导入,注意导入的文件,点选play以后,可以按wasd以及空格试试
我们接下来调整成第三人称的相机
把maincamera塞进unitychan里面,就可以跟随了
原画面有很多字,这其实是脚本文件
如果不想显示就进入源代码注释掉
12 add wall
首先聊一聊父子层级关系
之前把相机塞进unitychan里面,形成了父子关系
如果把plane也塞进unitychan里,那么就会一起掉落,因为unitychan是基于物理的;
如果把平行光也塞进unitychan里,那么阳光就会一直在后脑勺
我们为了深入理解父子关系,我们上网搜索crate texture
我们新建一个cube 贴上去
我们多用几个,然后撞上去,如果不锁死这个
我们会发现问题,走着走着人就飘起来了
我们进一步想要把unitychan关起来,我们需要用到这三个立方体,我们新建空物件把它们并起来
这么多箱子是不是很耗性能,确实,所以如果为了节约性能,可以把它设置成预置物件,实例化生产
我们设置也能写代码来控制它产生的地方
13 use block creator
打开assets store 搜索block creator,下载导入,会看到这些
我们用砖块搭一个简易的楼梯
但是重叠在一起的部分会出现z-fighting,互相打架,加个0.001
组成一个梯子
非均匀缩放不要用在父子物件上
14 iron bars
我们大概拉一个铁门
回到之前那个材质网站,搜索iron,下载一个材质,然后按照之前贴地面的方法贴上去
15-19 basic coding
我们想控制unitychan走到铁门时,铁门自动开启和关闭
我们需要自己新增组件
我们用vs打开,定义几个变量看看效果
我们实现jk控制铁门的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IronBars : MonoBehaviour
{
// 1.Variables 变量定义
public float maxY = 6.7f;
public float minY = 3.71f;
// Start is called before the first frame update
void Start()
{
// 2.一次性代码区
}
// Update is called once per frame
void Update()
{
// 3.重复性程序 60次/s
//print(gameObject.transform.position.x);
if (Input.GetKey(KeyCode.J) && transform.position.y < maxY)
{
transform.position = new Vector3(transform.position.x, transform.position.y+0.01f, transform.position.z);
}
if (Input.GetKey(KeyCode.K) && transform.position.y > minY )
{
transform.position = new Vector3(transform.position.x, transform.position.y - 0.01f, transform.position.z);
}
}
}
我们打算在门旁边放一个魔法阵,踩到才会打开门
一个quad配上魔法阵的贴图
新建MagicCircle的组件
勾选一下,第二行表示可以被侵入(不会把人物抬起来)
勾选了第二行要使用以下代码来判断
private void OnTriggerEnter(Collider other)
{
......
}
只有第一行的话要以下代码
private void OnCollisionEnter(Collision collision)
{
......
}
在代码中新建铁门,并把我们的铁门绑上去
两个文件的代码很简单
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MagicCircle : MonoBehaviour
{
public IronBars ironBars;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//进入时
private void OnTriggerEnter(Collider other)
{
}
//在里面
private void OnTriggerStay(Collider other)
{
ironBars.SendMessageUpwards("Up");
}
//退出时
private void OnTriggerExit(Collider other)
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class IronBars : MonoBehaviour
{
// 1.Variables 变量定义
public float maxY = 6.7f;
public float minY = 3.71f;
public float startY;
// Start is called before the first frame update
void Start()
{
// 2.一次性代码区
startY = transform.position.y;
}
// Update is called once per frame
void Update()
{
// 3.重复性程序 60次/s
//print(gameObject.transform.position.x);
if (Input.GetKey(KeyCode.J) )
{
if (transform.position.y <= startY + 3.0f)
{
transform.position = new Vector3(transform.position.x, transform.position.y + 0.01f, transform.position.z);
}
}
}
void Up()
{
if (transform.position.y <= startY + 3.0f)
{
transform.position = new Vector3(transform.position.x, transform.position.y + 0.01f, transform.position.z);
}
}
}
现在就能实现站在魔法阵上,铁门会上升了
20 physics konwledge
主要学习unity的collider组件
unity的物理引擎是nvdia的PhsyX,详情可以查维基,以上表格都是PhsyX的特性
在unity中game loop和render thread都是60次/s,但是硬件原因physics thread是50次/s
会在物理引擎里计算物理的东西有几种角色(结合表格理解)
我们的碰撞一定要算出接触点,所以kinematic和static以及自己这个类型的无法算碰撞
在做手机游戏的时候,能不用物理就不用物理
21 add particles
我们之前踩到魔法阵,没有什么效果,我们想用粒子系统加一些效果
粒子系统的使用可能要一到两周的时间,我们在asset store上搜索3d game effects pack free找现成的,下载并安装这个
选一个特效拖进去,点掉play on awake
我们让魔法阵的代码操作粒子效果,先拖进去
然后一下是魔法阵的代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class MagicCircle : MonoBehaviour
{
public IronBars ironBars;
public ParticleSystem ps1;
public ParticleSystem ps2;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
//进入时
private void OnTriggerEnter(Collider other)
{
if (ps1 && ps2)
{
ps1.Play();
ps2.Play();
Destroy(ps1.transform.parent.gameObject, 3.0f);
Destroy(ps2.transform.parent.gameObject, 3.0f);
}
}
//在里面
private void OnTriggerStay(Collider other)
{
ironBars.SendMessageUpwards("Up");
}
//退出时
private void OnTriggerExit(Collider other)
{
}
}