Unity3D基础论&脚本生命周期&基本属性\组件介绍


Unity3D基础论&脚本生命周期&基本属性\组件介绍_第1张图片

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帧/秒

你可能感兴趣的:(Unity3D基础论&脚本生命周期&基本属性\组件介绍)