Unity学习日志_Unity脚本

Unity学习日志_Unity脚本

1. unity脚本基础介绍

1. unity脚本中需要注意的事项:

  1. 一个脚本一个功能。
  2. 脚本是附加在游戏对象上用于定义游戏对象行为的指令代码。
  3. 文件名必须与类名一致。
  4. 写好的脚本必须附加到物体上才可以执行。
  5. 附加到游戏对象上的脚本必须继承MonoBehaviour类(单纯的工具类不需要继承此类)。
  6. unity脚本本质是一个c#类。
  7. 将unity脚本绑定到游戏对象(也是对象,GameObject类)上本质是创建了一个对象,并将对象的引用存储在游戏对象的“组件管理数组”中。(所以在inspector面板中修改属性值,修改的是一个对象的属性值,对象属性值和类中初始化的属性值不同)

2. 脚本生命周期

清楚unity引擎的函数调用时机

  1. 生命周期:unity脚本从唤醒到销毁的过程。
  2. 消息:在脚本生命周期中当满足某些条件时untiy引擎自动会去调用的方法。之前叫必然事件。

3. 脚本和C#类的区别

  1. 普通c#类的结构为:字段,属性,构造函数,方法,而脚本的结构为:字段,方法。
    1. 由于脚本挂在游戏对象上时构造函数会调用不止一次,所以失去了初始化的功能。脚本通常使用awake或者start函数初始化。
    2. 关于脚本为什么不使用属性为字段赋值:在unity脚本中有[SerializeField](unity特性)写在字段上面使私有字段可以公开在inspector面板中方便在游戏运行的时候修改私有值,也有[HideInInspector](unity特性)写在字段上面使public的字段在inspector面板中隐藏;而属性在inspector面板是不可见的,所以不使用属性。
  2. 注意在unity编程时,如果是普通的C#类(不挂载在游戏对象上)就按照标准的C#类写;如果是脚本(挂载在游戏对象上)就按照脚本标准写。

4. 脚本执行顺序:

1. 当脚本内函数相同时,会按照脚本的拖入顺序来执行。
2. 在ProjectSetting中的Script Execution Order可以人为改变脚本的执行顺序。

2. 脚本生命周期#2

在这里插入图片描述

1. 脚本生命周期部分简介#3

1. 初始化阶段#4
① Awake函数(针对游戏对象):#5
  1. 执行时机:创建游戏对象–》立即执行且只执行一次。
  2. 作用:Awake函数使不管脚本是否被启用都会执行的函数,通常用于初始化或者用于逻辑判断是否启用特定脚本。
② OnEnable函数:
  1. 执行时机:当脚本被启用时被调用。
③ Start函数:
  1. 执行时机:创建游戏对象–》脚本启用–》执行且只执行一次。
  2. 作用:Start函数永远在Awake函数执行之后执行,通常用于数值初始化。
④ 注意:
  1. Unity总是会先执行所有游戏对象上所挂载脚本的Awake函数,之后才会有可能执行Start函数。

通常初始化都放在Start函数中,当出现两个脚本之间存在执行顺序的时候,可以将优先执行的脚本初始化放在Awake函数中。

2. 物理更新阶段
① FixedUpdate函数:
  1. 执行时机:每隔固定时间会执行调用一次,默认为0.02s一次,时间可以修改。不受渲染影响(每渲染一次为一帧)。

  2. 作用:常用于物体的物理行为(移动,旋转等)。

② OnTriggerXXX函数:
③ OnCollisionXXX函数:
3. 输入事件
① OnMouseXXX函数:
  1. 调用时机:当鼠标XXX(按下,移入,移出等行为)物体Collision时调用。
4. 游戏逻辑阶段
① Update函数:
  1. 调用时机:每个渲染帧执行一次,受渲染快慢的影响(显卡渲染时的速度会受到渲染量,机器性能等因素的影响)。
  2. 作用:通常用于处理游戏逻辑而非物体的物理行为。因为游戏逻辑需要与画面同步,通常也将物体的物理行为写在update中。
  3. 为什么不用FixedUpdate处理游戏逻辑:FixedUpdate为固定时间调用,假设0.02s调用一次就等价于30帧,而当渲染帧达不到30帧或者超过30帧的时候会出现游戏逻辑延迟画面的现象。
② LateUpdate函数:
  1. 执行时机:同一渲染帧,在Update函数之后调用。
  2. 作用:通常用于处理游戏对象的跟随逻辑。
5. 结束阶段
① OnDisable函数:
  1. 调用时机:当游戏对象不可用或者游戏对象上的脚本不可用的时候调用。
② OnDestroy函数:
  1. 调用时机:当脚本销毁或者游戏对象销毁时调用。
③ OnApplicationQuit函数:
  1. 调用时机:当程序退出时调用。

3. Unity常用API

1. 核心类图:

在这里插入图片描述

  1. MonoBehaviour的继承关系:
    1. Object —》Component—》Behaviour—》Monobehaviour

2. Component类:

  1. inspector面板可以看见的组件都继承于Component类,提供寻找组件的功能。

  2. 脚本可以调用其所有父类的非私有属性和方法。

  3. Component类中存在大量的已有属性(字段)来存放组件引用如:material,transform等可不通过GetComponent方法就可以获得对应组件对象的引用。

  4. 跨组件方法调用是利用组件对象调用父类GetComponent方法实现的。例如我想要在脚本中更改物体颜色则需要通过脚本获得meshrenderer组件下的material下的color。

    this.GetComponent<MeshRenderer>().material.color = new color(1,0,0,1);
    
  5. GetComponent<>()系列方法提供了查找组件的方法。如果不是同一游戏对象则需要先查找指定游戏对象。GameObject类和Component类中都有GetComponent方法。

    1. 获得特定组件GetComponent();
    2. 获得所有组件GetComponents();返回类型是组件数组。继承的特点:既是T类型又是Component类型。
    3. 获得自身以及子对象组件:GetComponentInChildren;
    4. 获得自身以及父对象组件:GetComponentInParent;
  6. 注意:脚本中的this指代的就是这个脚本对象(添加组件的过程是建立组件对象的过程,在游戏对象中有一个数组负责管理组件对象的引用)的引用。Unity中的许多已有变量都是在提供引用,以方便开发者。

  7. 继承Component类的类都可以使用GetComponent,GameObject类也有GetComponent方法,继承GameObject类也可以使用GetComponent方法。

3. Transform类:

  1. 提供了在家族树中查找transform组件的功能,设置物体位置(移动),角度(旋转),大小的功能。

  2. 可以使用tranform获得所有第一代子物体的transform组件,直接foreach遍历即可。之后可以用gameObject来指向游戏物体。因为Transform类继承于Component类,可以使用gameObject属性。

  3. Transform中的三对属性:

    1. Position和LocalPosition:
      1. Position是相对于世界坐标的位置。
      2. LocalPostion是相对于父物体的位置。
    2. Rotation和LocalRotation:
      1. Rotation是相对于世界坐标的旋转。
      2. LocalRotation是相对于父物体的旋转。
    3. LocalScale和LossyScale:
      1. LocalScale是相对于父物体的缩放比例。
      2. LossyScale则是存储LocalScale中子物体的实际比例。LossyScale的值由LocalScale确定且不能直接更改(只有get没有set)。
  4. transform.root:寻找根物体的transform组件。

  5. transform.parent:寻找父物体的transform组件。

  6. Transform一些常用函数:

    1. transform.Tranlate(0,0,1);向自身z轴方向移动1米。
    2. transform.Translate(0,0,1,space.World);向世界z轴移动1米。
    3. transform.Rotate(0,0,1);向自身z轴旋转1度。
    4. transform.Rotate(0,0,1,space.World);向世界z轴旋转1度。
    5. transform.RotateAround(Vector3.Zero,Vector3.up,1);以(0,0,0)为原点,y轴为轴旋转1度。
    6. transform.SetParent(Transform类,[true/false]);将某个游戏对象的transform组件设置为该物体的父物体。默认为true,表示认为自身坐标为世界坐标,设置父物体后相对位置不变,false表示认为自身坐标为LocalPosition,设置父物体后,相对位置改变。
    7. transform.Find(“子物体名称或者孙物体路径”);寻找某一特定子物体或者孙子物体返回Tranform类型。只能直接查找子物体,孙物体需要路径查找。但不建议用此方法查找孙物体的transform组件。可以使用此方法递归查询孙物体。
    8. SetSiblingIndex();设置同级对象索引。UI中常用。

4. GameObject类:

  1. GameObject类(提供操作游戏对象相关功能):

  2. Hierarchy面板中的物体都是GameObject类的。

  3. GameObejct中一些常用的变量:

    1. SetActive:启用或者禁用游戏物体,设置true或false。
    2. ActiveSelf:读取当前挂在对象的局部激活状态。
    3. ActiceInHierarchy:获取当前挂载对象的实际激活状态。
    4. 注意:独立物体SetActive = false则ActiveSelf为未激活,但如果是父子关系的物体,禁用父物体子物体也会被禁用,但子物体的ActiveSelf还是激活的状态。ActiceInHierarchy则显示为未激活。
    5. layer:物体当前所在的层。
    6. Sence:当前物体所在的场景。
    7. tag:当前物体所带的标签。
    8. transform:存放当前对象的transform组件引用。
    9. 注意:非GameObject类的对象想使用GameObject的变量,需要在脚本中先 .gameObject获得当前游戏对象的引用。
  4. GameObject中一些常用的函数:

    1. gameObject.AddComponent();为一个游戏对象添加组件,注意此方法会自动生成对应的组件对象,不用单独实例化组件对象也不能实例化组件对象。返回类型为T。
    2. 也有GetComponent<>();系列方法。
    3. 静态方法Find(“游戏对象名称”);会在hierarchy面板中遍历查找,不建议使用。
    4. 代替Find方法:gameObject.FindWithTag(“标签名”);在标签名中查找效率比Find方法要好。
    5. FindGameObjectsWithTag(“标签名”);查找一个系列的游戏对象。

5. Object类:

  1. Object类(提供所有类的基础功能):

  2. Object中部分常用方法:

    1. Destroy();销毁游戏对象,组件或资源。
    2. FindObjectOfType<>();根据类型找游戏对象,返回找到的第一个游戏对象。
    3. FindObjectsOfType<>();根据类型找游戏对象,返回所有找到的游戏对象。
    4. Instantiate();克隆游戏对象并生成,参数列表:预制件,位置,角度。返回值类型为Object类型,可强转为GameObject。常用于生成游戏对象。

6. Time类:

  1. Time类:只有变量可用,方法被封装不可用
    1. time:存储从游戏开始到现在的时间,返回值类型为float。
    2. deltaTime:每一帧渲染所需要的时间。在update中处理物体物理行为时需要*一个deltaTime,这样可以保证帧数不同但移动距离或者旋转角度是相同的。
    3. timeScale:时间缩放,可以用来做暂停游戏效果,和慢放效果,默认为1;注意:FixedUpdate受timeScale影响,Update不受影响(Update每个渲染帧之后调用)。确切的说timeScale控制的是Time类,一旦Update中有参数与deltatime有关,也会被暂停。
    4. unscaleTime和unscaleDeltaTime,不受timeScale影响的time和deltaTime,用于制作在时间暂停时部分物体可动的效果。
  2. 多帧调用的几种方法:
    1. Time.time
    2. Time.deltaTime
    3. InvokeRepeating重复调用方法优先考虑,该方法常常放在Start函数中。
    4. 如果想要取消Invoke调用则使用方法Cancelnvoke。
    5. 协程

3. 游戏人物对象脚本逻辑

本逻辑图使用了老板的动画组件。

在这里插入图片描述

关于动画组件的详细分工图:

在这里插入图片描述

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值