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


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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容