Unity3D学习笔记(一):Unity简介、游戏物体、组件和生命周期函数
Project(工程、项目):工程是把游戏开发当前所需要的资源归类管理用的。
Console控制台:日志、报错、调试,右上角,消息过滤



MonoBehaviour:是每个脚本派生的类的基类。
Start、Updata(生命周期函数、事件函数):在特定的时间点被游戏引擎被动调用的函数叫做生命周期函数。
Unity分为编辑内存和运行内存
第一步实例化所有游戏物体的组件
第二步激活所有游戏物体的组件
Awake():在此组件被实例化的时候执行一次
OnEnable():在此组件被激活的时候执行一次
OnDisable():在此组件被失活的时候执行一次
Start():在此组件对象第一次被激活的时候执行一次(在游戏开始的时候被执行一次,用来初始化)
Updata():每一画面刷新帧被调用一次(在游戏物体和脚本组件被激活的情况下)
FixedUpdate():每一物理帧更新刷新一次(物理帧是固定帧0.02秒)
LateUpdate():每一画面刷新帧被调用一次,只不过比Updata要晚(常用于摄像机跟随,防抖)OnDestroy():在此组件被销毁(remove)的时候执行一次(游戏运行时,在运行内存中销毁,编辑内存仍在)
帧(Frame):屏幕刷新的表示方式
帧率(FPS):帧率 = 帧数 / 时间 (单位时间内画面刷新的帧数)
肉眼:
手游:~
PC/主机游戏:~
VR:120以上
collapse折叠调用,显示调用次数
整个游戏物体的激活与失活,游戏物体被激活失活时,会同步激活失活游戏物体的组件
单个物体组件的激活与失活
Mesh网格,正方形4个顶点2个三角面,平面10x10米,面片1x1米
Snap settings 吸附
给物体添加图标
Unity3D 快捷键
当前轴心旋转:Alt+鼠标左键
移动场景:鼠标滚轮键 / Q
缩放场景:使用鼠标滚轮键 / Alt+鼠标右键
居中所选物:F
飞行浏览:鼠标右键+WSAD(按Shift加速),QE上下
Edit菜单
播放:Ctrl+P,暂停:Ctrl+Shift+P,单帧预览:Ctrl+Alt+P
Assets菜单
刷新:Ctrl+R
GameObject菜单
新建空对象:Ctrl+Shift+N,移动物体到视图中心点:Ctrl+Alt+F,移动物体与视图对齐:Ctrl+Shift+F
Component菜单
添加组件:Ctrl+Shift+A
近距离查看游戏对象
在Hierarchy视图中选择游戏对象,然后在Scene视图中按快捷键“F”来近距离查看该游戏对象。
游戏对象不在主摄像头中
Hierarchy中双击选择需要显示的游戏对象,再单击Main Camera选中,最后Ctrl+Shift+F键盘即可。
旋转视图
Alt键 + 鼠标左键 可以任意拖动鼠标来旋转视图。如果x,y,z坐标轴恢复不了,可以先单击X轴(Y、Z)再鼠标右键选择“Free” 最后通过这个来调试。
缩放视图:滚动鼠标中键可以缩放整体视图。
变换工具栏:拖动工具:Q 移动工具:W 旋转工具: E 缩放工具:R
按住Ctrl键移动物体会以一定的增量来移动物体
Edit-Snap Setting 栅格和捕捉设置
Ctrl+Shift 使物体在另一个物体上移动,物体在被相交的物体上移动
顶点吸附 选中物体,按键盘V键 就可以看到物体的顶点:可以快速使两个物体定位
关闭顶点吸附:Shift+V
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]//类和结构都需要被序列化后,才可以在检视面板显示
public class Student
{
public string name;
public int age;
public override string ToString()
{
return string.Format("[name:{0},age:{1}]",name ,age);
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Unity1803 : IEnumerable
{
List<Student> students;//我没有加public,老师加了public
public Unity1803()
{
students = new List<Student>()
{
new Student() { name = "张三",age= },
new Student() { name = "李四",age= },
new Student() { name = "王二",age= },
new Student() { name = "赵六",age= },
new Student() { name = "田七",age= },
};
}
public IEnumerator GetEnumerator()
{
//返回的对象 必须实现了IEnumerator接口
Unity1803IEnumerator ie = new Unity1803IEnumerator(students);
return ie;
//简便写法
//yield是C#为了简化遍历操作实现的语法糖,我们知道如果要要某个类型支持遍历就必须要实现系统接口IEnumerable,这个接口后续实现比较繁琐要写一大堆代码才能支持真正的遍历功能。
//for (int i = 0; i < students.Count; i++)
//{
// yield return students[i];
//}
}
public class Unity1803IEnumerator : IEnumerator
{
List<Student> students;
int index = -;
public Unity1803IEnumerator(List<Student> students)
{
this.students = students;
}
public object Current
{
get
{
return students[index];
}
}
//是否移出了集合的范围 返回true 表示当前的指针还在范围内 false则是在范围外
public bool MoveNext()
{
index++;
return index < students.Count;
}
public void Reset()
{
index = -;
}
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]//类和结构都需要被序列化后,才可以在检视面板显示
public class Enemy
{
public string name;
public int atk;
public int hp;
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public enum EEnemyType
{
战士,
法师
}
public class NewBehaviourScript : MonoBehaviour
{
//以检视面板为准
public int intNum = ;
//私有变量不会在检视面板显示
//特性:[]标签的形式
//可以把私有的字段在检视面板中显示出来
[SerializeField]//序列化字段 Attribute 反射(程序集.exe .all)
private float floatNum = 0.0f;
[Multiline()]//让字符串多行显示
public string str = "";
[Header("战士的类型")]//说明文本
public EEnemyType enemyType = EEnemyType.战士;
[Header("XX的数量")]
public int[] nums;
[Header("XX的数量")]
public List<int> listArray;
public Student student;
public List<Enemy> enemyList;
public Enemy enemy = new Enemy();
public Unity1803 unity = new Unity1803();
private void Awake()
{
//Debug.LogFormat("Int :{0}", intNum);
//Debug.Log("Float :" + floatNum);
//Debug.Log("Str : " + str);
//Debug.Log("EnemyType :" + enemyType);
////Debug.Log("Awake");
////Debug.LogWarning("Awake");
////Debug.LogError("Awake");
//foreach (var item in nums)
//{
// Debug.Log("item :" + item);
//}
}
private void OnEnable()
{
Debug.Log("this is OnEnable");
}
// Use this for initialization
void Start()
{
Debug.Log("this is Start");//输出
// 挂载的条件
// 1. 继承 MonoBehaviour
// 2. 文件名与类名相同
// 3. 挂载时,所有的代码无编译错误
// 4. 挂载的脚本不能是抽象类
int num = Random.Range(,);
Debug.Log(num);
int[] nums = new int[] { , , , , , , };
List<int> list = new List<int>() {,,,,,, };
foreach (var item in nums)
{
Debug.Log("item:" + item);
}
foreach (var item in list)
{
Debug.Log("item:" + item);
}
//IEnumerable 枚举器:其实就是一种机制,具有可以逐个访问某个集合每个元素的功能 {a,b,c,d}
//IEnumerator 迭代器:实现了上面这种机制的具体的 (一个或多个)方法
Unity1803 unity = new Unity1803();
foreach (var item in unity)
{
Debug.Log("item:" + item);
}
}
// Update is called once per frame
void Update()
{
Debug.Log("this is Update");
}
private void FixedUpdate()
{
Debug.Log("this is FixedUpdate");
}
private void LateUpdate()
{
Debug.Log("this is LateUpdate");
}
private void OnDisable()
{
Debug.Log("this is OnDisable");
}
private void OnDestroy()
{
Debug.Log("this is OnDestroy");
}
}
OnPreCull: 在相机剔除场景之前调用此函数。相机可见的对象取决于剔除。OnPreCull 函数调用发生在剔除之前。
OnBecameVisible/OnBecameInvisible: 在对象对于相机可见/不可见时调用此函数。
OnWillRenderObject: 如果对象可见,则为每个相机调用一次此函数。
OnPreRender: 在相机开始渲染场景之前调用此函数。
OnRenderObject: 在完成所有常规场景渲染后调用此函数。此时,可使用 GL 类或 Graphics.DrawMeshNow 绘制自定义几何图形。
OnPostRender: 在相机完成场景渲染后调用此函数。
OnRenderImage(仅限专业版): 在完成场景渲染后调用此函数,以便对屏幕图像进行后处理。
OnGUI: 在每帧上多次调用此函数,以响应 GUI 事件。程序首先将处理 Layout 和 Repaint 事件,然后再处理每个输入事件的 Layout 和 keyboard/鼠标事件。
OnDrawGizmos: 用于在场景视图中绘制小图示 (Gizmos),以实现可视化目的。
Unity3D学习笔记(一):Unity简介、游戏物体、组件和生命周期函数的更多相关文章
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- Unity3D学习笔记6——GPU实例化(1)
目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次 ...
- Unity3D学习笔记4——创建Mesh高级接口
目录 1. 概述 2. 详论 3. 其他 4. 参考 1. 概述 在文章Unity3D学习笔记2--绘制一个带纹理的面中使用代码的方式创建了一个Mesh,不过这套接口在Unity中被称为简单接口.与其 ...
- Unity3D学习笔记12——渲染纹理
目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实现就 ...
- unity3d学习笔记(一) 第一人称视角实现和倒计时实现
unity3d学习笔记(一) 第一人称视角实现和倒计时实现 1. 第一人称视角 (1)让mainCamera和player(视角对象)同步在一起 因为我们的player是生成的,所以不能把mainCa ...
- Unity3D学习笔记2——绘制一个带纹理的面
目录 1. 概述 2. 详论 2.1. 网格(Mesh) 2.1.1. 顶点 2.1.2. 顶点索引 2.2. 材质(Material) 2.2.1. 创建材质 2.2.2. 使用材质 2.3. 光照 ...
- Unity3D学习笔记7——GPU实例化(2)
目录 1. 概述 2. 详论 2.1. 实现 2.2. 解析 3. 参考 1. 概述 在上一篇文章<Unity3D学习笔记6--GPU实例化(1)>详细介绍了Unity3d中GPU实例化的 ...
- Unity3D学习笔记8——GPU实例化(3)
目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1)&g ...
- C#.NET学习笔记1---C#.NET简介
C#.NET学习笔记1---C#.NET简介 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com -------------- ...
- Linux学习笔记-Linux系统简介
Linux学习笔记-Linux系统简介 UNIX与Linux发展史 UNIX是父亲,Linux是儿子. UNIX发行版本 操作系统 公司 硬件平台 AIX IBM PowerPC HP-UX HP P ...
随机推荐
- hibernate注解(一)JoinColumn
@Entity @Table(name="t_group") public class Group { private int id; private String name; p ...
- Linux中Kill掉进程的10种方法
常规篇: 首先,用ps查看进程,方法如下: 复制代码 代码如下: $ ps -ef……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 1823 1822 ...
- SQLserver数据库连接问题
可能安装好之后数据库的端口1433被防火墙拦截了,查看端口是否在监听当中: 在cmd里输入命令 :netstat -an 查看是否处在监听中,如果没有进入下面的设置, C:\Windows\SysWO ...
- pem转cer
openssl x509 -inform pem -in fullchain.pem -outform der -out fullchain.cer
- iOS 第三方框架-MJRefresh
MJRefresh是一款非常好用的上拉下拉第三方库,使用也很简单.github地址: https://github.com/CoderMJLee/MJRefresh . 下拉刷新 官方给过来的例子很简 ...
- 人生苦短之我用Python篇(socket编程)
socket模块 实现简单的远程连接: 客户端: import socket client = socket.socket()#声明socket类型,同时生成socke连接t对象 client.con ...
- Python 运算符与基本数据类型
一.运算符 1.算数运算: 2.比较运算: 3.赋值运算: 4.逻辑运算: 5.成员运算: 二.基本数据类型 1.空(None) 表示该值是一个空对象,空值是Python里一个特殊的值,用None表示 ...
- DOS操作系统的历史
昨日(7月27日),微软公司的DOS操作系统迎来了30岁生日. DOS是历史上一个划时代的产品,标识着PC(个人电脑)的崛起和普及,对计算机行业影响深远. 只有了解DOS的历史,才能理解今天的计算机工 ...
- web前端----JavaScript(JS)简单介绍
JavaScript(JS) 一.JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEa ...
- 静态编译C/C++程序
静态编译C/C++程序,让程序运行不受平台限制 由于Linux操作系统的特有elf加载顺序. (可以参考此文). 虽然可以很大程度上解决Windows早期版本的dll hell问题, 但是给部署带来了 ...