Unity工程结构:
Assets文件夹:存储工程所需的所有资源文件
Library:工程所需要的所有资源库(类库)(自动生成的)
ProjectSetting:工程设置文件
Temp:临时文件
Unity开发框架:项目->场景->游戏对象->组件->属性
面向组件开发思想
帮助文档API查询:
Unity里Help - Unity Manual
脚本:
Unity脚本支持:C#、JS; 脚本创建:文件名与类名一致,继承MonoBehaviour(脚本组件一定要继承此类)
Unity脚本生命周期:
九个回调方法
返回值类型为void
第一帧调用一次: Awake()、OnEnable、Start()
持续调用: FixedUpdate()、Update()、LateUpdate()、OnGul()
收尾: OnDisable()、OnDestroy()
Awake(): 当游戏开始执行的时候就会调用,只会被调用一次不管当前的脚本有没有激活,这个方法都可以被调用
Start(): 游戏开始第一帧的时候被调用,这个方法也会执行一次;如果脚本是禁用状态,则这个方法不会被触发
OnEnable(): 当这个脚本被激活的时候触发,这个方法会被执行多次;每次激活脚本的时候,这个方法都会被触发
Update(): 每帧调用
LateUpdate(): 每帧调用,延迟调用,总会在Update执行结束后调用
FixedUpdate(): 每隔一段固定的时间调用一次,方法每两次调用的时间间隔是相同的
Edit -> Project Settings -> Time -> Fixed Timestep 这个位置查看相隔的时间
OnGui(): 每帧调用两次
OnDisable(): 每当脚本组件被设置为不可用时调用一次
OnDestroy(): 当脚本组件被销毁,或整个游戏对象销毁时调用一次
Debug.Log()打印
基础属性介绍:
GameObject: 在Unity中,我们使用gameObject来表示脚本关联的游戏物体
注意事项:
在程序运行状态下,对场景进行的任何的修改(修改GameObject,包括添加或者删除GameObject),仅仅是为了方便测试这个修改带来的影响,而并不会真正的修改场景。这些改动将会在程序停止运行的时候还原。
在程序运行的状态下,不允许保存场景。
保存场景,只能保存在Assets文件夹中。
常用的GameObject:
Cube, Sphere, Cylinder, Capsule, xxx ........
获取当前游戏物体的激活状态 (activeSelf)
bool isActive = gameObject.activeSelf; Debug.Log(isActive);
设置当前游戏物体的激活状态ture激活/false未激活 (SetActive(bool);)
gameObject.SetActive(false);
访问当前游戏物体的名字 (name)
string name = gameObject.name; Debug.Log(name); gameObject.name = "QWERT";
tag:标签
功能是为了分类管理游戏物体的
每一个游戏物体都可以去设置一个标签,多个游戏物体是可以设置为相同标签的
访问当前游戏物体的标签
string name = gameObject.tag;
Debug.Log(name);
警告:设置游戏物体的标签的时候,一定要保证这个标签是存在的,否则设置标签会出错
gameObject.tag = "XYZ";
访问游戏物体的层 (layer)
gameObject.layer
获取游戏物体的组件 (GetComponent)
Transform renderer = gameObject.GetComponent();
Debug.Log(renderer.position);
获取(其他的)游戏物体;通过游戏物体的名称查找 (Find)
GameObject obj = GameObject.Find("Main Camera");
通过标签来获取游戏物体 (FindWithTag)
GameObject obj = GameObject.FindWithTag("ABC");
通过标签查找的时候,一定要保证这个标签是存在的
GameObject obj = GameObject.FindWithTag("DFG");
Debug.Log(obj);
通过标签来获取多个游戏物体 (FindGameObjectsWithTag)
GameObject[] objs = GameObject.FindGameObjectsWithTag("ABC");
foreach (GameObject obj in objs)
{
obj.SetActive(false);
}
Vector3:(结构体)
Vector3是用来表示三维坐标 X、Y、Z
Vector3 temp0 = new Vector3(1, 1, 0)
normalized: 当前向量的标准化向量(归一化)
当归一化时,向量保持相同的方向,但其长度为1.0。 返回此大小为1(只读)的向量。
方法和temo向量相同,大小为一个单位
Vector3 normal = temp0.normalized;
Debug.Log(normal);
Magnitude:求向量的模 (长度)
float length = temp0.magnitude;
Debug.Log(length);
sqrMagnitude:求向量模平方 (比较两个向量的长度)
float sqrt = temp0.sqrMagnitude;
Debug.Log(sqrt);
Angle(值,值):求两个向量的夹角 都是Static float的
Vector3 v0 = new Vector3(1, 0, 0);
Vector3 v1 = new Vector3(0, 1, 0);
float degress = Vector3.Angle(v0, v1);
Debug.Log(degress);
Distance:求两个点的距离
DVeVistance(值,值):求两个点的距离
Vector3 p0 = new Vector3(1, 1, 0);
Vector3 p1 = new Vector3(0, 0, 0);
float distance = Vector3.DVeVistance(p0, p1);
Debug.Log(distance);
Lerp(值,值,float):插值函数
在unity中,使用Lerp更多是来做跟随效果的
GameObject obj;
obj = GameObject.Find("Here");
主人位置 宠物位置
Vector3 position = Vector3.Lerp(gameObject.transform.position, obj.transform.position + new
多长时间回归位置
Vector3(2, 0, -2), 1*Time.fixedDeltaTime);
gameObject.transform.position = position;
Quaternion(结构体)(四元数):
identity:空旋转
LookRotation: 将一个向量转换为这个方向所代表的四元数
Lerp: 插值
Mathf(结构体):
Abs : 求绝对值
Lerp(float,float,float) 插值函数
线性插值函数:
在两个数字之间插入一个新的数字
1.插值的取值范围只能是【0,1】
2.建议Statr < End开始<结束
Lerp
//0 10
// from + (to - from) * t
最小值+最大值 — 最小值*插入的数字(0到1)
float result = Mathf.Lerp(0,10,0.5f);
Debug.Log(result);
Clamp: 限制值
作用:给定一个范围,如果某一个数字在这个范围内,返回这个数字本身;如果超出上限,返回上限;如果超出下限,则返回下限
//第一个参数:需要判断的数字 第二个参数:范围的上限 第三个参数:范围的下限
Mathf.Clamp(); Debug.Log(Mathf.Clamp(40,60,100));
三角函数:
Mathf.Sin();
Mathf.Cos();
Mathf.Tan();
反三角函数:
Mathf.Asin();
Mathf.Acos();
Mathf.Atan(); 反正切
Mathf.Atan2(值,值); 弧度
Mathf.Rad2Deg(); 弧度转角度
gameObject.transform.eulerAngles = new Vector3(0, Mathf.Atan2(h, v) * Mathf.Rad2Deg, 0);
Mathf.PI 圆周率
Transform:
获取游戏物体的transform组件 (GetComponent)
Transform t = gameObject.GetComponent();
在Unity中,一些比较常用的组件,系统已经写成了属性了
position 属性: position属性表示的是相对于世界原点的位置
gameObject.transform.position = new Vector3(1, 1, 1);
localPosition属性: localPosition表示的是相对于父物体的坐标
gameObject.transform.localPosition = new Vector3(2, 2, 2);
eulerAngles欧拉角属性: 表示一个物体旋转的角度;是相对于世界坐标的
gameObject.transform.eulerAngles = new Vector3(0, 0, 0);
localEulerAngles属性: 表示一个物体旋转的角度;自身欧拉角,这是对象自己相对于父对象的旋转角度
gameObject.transform.localEulerAngles = new Vector3(45, 0, 0);
localScale属性 物体缩放:
gameObject.transform.localScale = new Vector3(1.5f, 1, 1);
Translate移动方法:
方法的参数是一个Vector3类型的数据
表示将当前的物体沿着Vector3的方向和大小去移动
gameObject.transform.Translate(Vector3.right);
Rotate旋转方法(自转):
方法的参数也是一个Vector3类型的数据
表示将当前的物体沿着Vector3的方向和角度进行旋转
gameObject.transform.Rotate(new Vector3(45, 0, 0));
RotateAround旋转方法(公转):
参数1:需要围绕哪个点旋转
参数2:需要围绕哪个轴旋转
参数3:旋转的角度
GameObject red = GameObject.Find("red");
gameObject.transform.RotateAround(red.transform.position, Vector3.up, 45);
LookAt :将当前的游戏对象看向某个位置:
将这个游戏对象的z轴正方向指向某个位置
gameObject.transform.LookAt(new Vector3(0, 0, 1));
gameObject.transform.LookAt(new Vector3(0, 0, 1));
SetParent:
设置父物体 (SetParent)
GameObject camera = GameObject.Find("Main Camera");
gameObject.transform.SetParent (camera.transform);
GetChild获取子物体
childCount : 子对象个数
Parent: 父对象
root : 根对象
Time: 时间
time: 获取从游戏开始,到现在,所经历的时间(s)
float time = Time.time; Debug.Log(time);
fixedDeltaTime: 获取Fixed时间间隔,默认0.02s
Time.fixedDeltaTime;
deltaTime: 需求:无论游戏的帧率多,每秒移动10个单位
Time.deltaTime; //从这一帧到下一帧的时间间隔
gameObject.transform.Translate(new Vector3(1 * Time.deltaTime, 0, 0));
gameObject.transform.Translate(new Vector3(0.1f, 0, 0));
timeScale:时间缩放
Time.timeScale = 1;
基本组件介绍:
一、材质(球) Material
GameObject的外观展示是由材质来决定的,一个GameObject在新建后会有一个默认的材质Default-Material,这个材质不允许修改。如果我们想修改一个GameObject的外观展示,需要自己新建一个材质,然后将这个材质关联给一个GameObject.
在Project面板,右键,新建,Material
将一个材质球直接拖到GameObject身上即可完成关联。
注:虽然也可以直接拖动图片到GameObject身上来完成图片展示,但是不推荐。这样做的本质是自动的生成一个材质球,并将自动生成的这个材质球关联给GameObject
二、Component组件
Unity是基于组件的一个游戏引擎,如果需要使一个GameObject添加某个功能,只需给他添加特定的组件即可。组件可以添加,也可以移除,但是Transform这个组件不能移除。
三、Rigidbody刚体属性
Mass:质量
Drag:阻力
Use Gravity:使用重力
is Kinematic:运动学(勾上后,不会有重力模拟,只保留碰撞)
Constraints:约束条件
四、Prefabs预设体
模板
Select 选中 查看预设体选用了那个模板
Revert 还原 还原这个物体预设体的初始状态 只能还原 x 旋转 z 大小 位置y 不能还原
Apply 将选中物体的属性应用到预设体上
五、父子关系
如果一个物体有父物体,那么这个物体的坐标是相对于父物体的中心点的
如果一个物体没有父物体,那么这个物体的坐标是相对于世界远原点的
常用坐标点:
Vector3.zero; //(0,0,0)
Vector3.right; //(1,0,0)世界右方
Vector3.up; //(0,1,0)世界上方
Vector3.forward; //(0,0,1)世界的前方
Vector3.back;世界后方
Vector3.left;世界左方
常用调试方法:
打印: Debug.Log() ; print();
划线/DrawLine:
特点:1.只会在场景中展示,不会被摄像机拍摄到
2.过一段时间会消失,不会影响原有的视图
从什么位置开始画,画的位置,画的颜色持续的时间
Debug.DrawLine(Vector3.zero,Vector3.right,Color.red,10);
3D基础理论:
物体的向量/标量: 向量: 有大小有方向 标量: 有大小无方向
向量的加减:
Vector3 v0 = new Vector3(1,0,0);
Vector3 v1 = new Vector3(0,1,0);
加:Vector3 v = v0 + v1;
减:Vector3 v = v0 - v1;
向量的叉乘:
Cross:
Vector3 tmp = Vector3.Cross(tmp0,tmp1);
欧拉角: 物体绕XYZ轴旋转的角度
网格: 由一个个的三角形组成
模型:粗模(低模) 细模(高模)
纹理: 网格贴图
组件: Mesh Filter 网络选择器 Mesh Renderer 网格渲染器
材质: 用于渲染网格的文件
Shader: 着色器 :控制材质球如何渲染的脚本 CG语言
帧速率(FPS): 每秒刷新多少帧数
作用: FPS越高播放越流畅 性能消耗越大 反之 性能消耗越小 人眼分别的帧数 24帧/秒