学习笔记09C#

 

 

结论必须要学

==================================================

脚本想要起作用就需要把他拽到一个物体上,拽到物体上有一个前提条件,就是脚本的名字和里面类的名字必须一致,否则就会出错。

在Unity中,所有的脚本都默认继承于上边这个Mono类。都必须继承。

关于这类的引擎内的语言编程学习,其实主要是单纯的语法,就是C#语法,加上引擎的API的学习。

三个using都是命名空间里的东西。

这里UnityEngine是高亮的,是因为他被用到了,这里的Mono。。类就是他的命名空间下的,这三个都是比较常用的命名空间,所以这里就自动生成了。

===============================================

start函数,会在第一帧之前进行执行。

访问修饰符如果不写,默认是private。

如果不继承Mono这里的这俩方法就是普通的函数,没有如上叙述的特殊调用时机。

右键可以转到定义。

print大法。

Debug是一个UnityEngine下的类。这里类似使用类名调用静态成员函数。

这里有三类log输出,可以查看。

输出的时候可以叠加,把相同的输出叠加在一起。

还有一些其他的log玩法

变量

输出

=======================================================================================================================

脚本如何在面板中开放一些参数,然后和我们进行一个交互。

开放到外部访问必须是public的,私有变量小写开头驼峰,公共变量大写开头驼峰。

只要是写成public的,外面就直接展示出来了。

脚本右上角的三个点可以reset刷新,表示一些参数值的设置都回到最开始。另外这些参数可以设置默认值在代码中,外部会显示出来。

加一个按钮,这个点击之后就是mono。。提供的一些内置的方法。

GUI是一个类,也是UnityEngine里面的。

运行状态下就会有这么一个按钮。所以OnGUI的函数都是运行时才执行的。

点击这个GUI.Button的时候,就返回true。

=========================================================================================

一个脚本调用另外一个脚本

这里定义一个不需要和Unity挂钩的,因为这个是被其他脚本调用,不放到引擎中的物体中。

注意访问修饰需要时public

使用这些方法的时候,需要进行一个实例化。除非静态函数。

其实我们把c#脚本拽到场景内某一个物体上的时候,其实Unity就是帮我们实例化了一个对象。

注意这里的类之间是直接互相通用的,原因就是在同一个工程下,只要没有指定命名空间,他们都是相通的。

添加命名空间的方法:

这里是用了taecg下的math的命名空间。然后{}套起来即可。

这时候想要从另外的一个类中使用上边这个类中的东西,就得:

或者是:

还有一种方式,就是把俩弄到一个命名空间里,那他俩就又通用了。

定义一个数组。

右键可以操作

长度方法

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Unity中的脚本API大致分为两类,我们要按照上边的比例去掌握。

UnityEngine中的就是一些运行时的API,点击按钮后怎么怎么的。

UnityEditor是编辑器下用到的API,没有点击运行的时候,实现的一些功能,比如说做一些插件,工具。

 

==============================================

左边这些都是一些object实例,最简单的会有一个transform组件。

对比来看,这里的球会有很多的组件。

其实一切物体都可以理解为:最开始一个空对象,然后添加各种不同的组件所形成的。

一个灯,移除了light组件就不是灯了。

删除了可以加回来。

其实大致这么个关系:在project里面躺着的一个个文件对象,可以认为是一个个的class,然后拽到场景内,也就是在大纲中会出现的对象,那就变成了一个个的实例化的对象。

而我们可以控制这些对象身上的属性,对属性进行增删。都是一个空类,然后加入了一些组件。

我们先要实现用脚本对物体对象的控制,首先需要在脚本内部访问到物体。首先需要脚本发挥作用,那就是拽到任何一个物体上。就可以起作用。

起作用之后,我们让他获取某一个物体,我们直接在他里面定义一个变量,变量类型就是gameObject,

我们也说过,gameObject是最基本的类型,其他的object都可以理解为继承他的。所以这里可以用一个该类型的变量,

然后在脚本对应的面板中,我们可以对这个变量进行赋值,那么接下来就可以在脚本里面控制这个对象了。

确实像说的那样,这里他继承于Object。其他人继承于他。

这里写代码的时候,可以对代码分块,然后用region和endregion包起来,然后后面可以自己备注上名字,代码更整洁。

还有一种方式来获取场景中的对象,就是利用名字查找。

这是是可以直接输出的。

一般情况使用第一种。

访问到对象之后,对象加点可以对对象内的属性进行一个访问。这里的扳手符号的意思是对象的属性变量,六边形那个是代表函数。

我们之前说过,对象的核心就在于他的一个个组件,那么我们可以直接以同样的方式来对组件进行一个访问和修改。

c#中的0.1必须加f。

一个box的组件,mesh filter网格相关的,渲染相关的,碰撞体相关,材质。

对于transform我们直接可以用点找到transform属性,但是对于其他的组件是不能这么获取的。

注意这些mr都是引用的关系!这些赋值都是引用。

获取材质的时候,这里有俩,带s的是一个材质数组,有可能一个模型使用多个材质,注意是一个模型,之前我们的那个一个模型多材质其实是多个模型,组成一个整体,这里指的是一个模型,这时候一个模型多个材质,那么模型会被进行多次渲染,会有大的性能消耗。

这里不带s即可。

运行注意这里的材质球的名字是带有一个instance的。

停止运行之后,instance就没了。这是因为在脚本里面获取材质的时候,他获取到的是一个实例。所以unity在运行时帮我们创建了一个。

这是因为一个材质球如果被俩物体用,你用脚本修改其中的一个,另外一个不会随着改变,因为你修改的只是针对该物体的一个材质。

他俩是一个材质球,然后运行,修改球的材质的颜色,盒子不会随着修改。

如果停止运行,那么盒子的材质就不再是实例。会回到和球同用一个材质,

变成了相同的颜色。

如果你就是想要他不是instance的,就是公用的那个:

c#中的auto。

=====================================================

 访问到材质球之后,下一步我们要访问材质面板上的一些属性,然后用代码来修改这些属性。

这里之前就实现过通过点击,来实现溶解等效果,其实溶解整个过程是一个变量在随着时间变化,我们就需要去用代码去控制这一点。

对于c#脚本修改名字之后,他在面板中被赋值的一些对象会丢失,需要重新拖拽赋值。

在获取他的材质之前,有一点:

这里的character是一个复合的物体,外面是一个父级对象,只有一个transform和动画。

我们真正想要访问的是mesh里面的guard,这里面就有我们想要的材质了。

这里他的组件的名字是SkinnedXXX,这是因为他是带有骨骼动画的,带有蒙皮信息的。

关于骨骼(Skeleton)、绑定(Rigging)、蒙皮(Skinning)、刷权重(Weight Painting)那些事儿(9月3日 更新)_开发游戏的老王的博客-CSDN博客

那么我们获取材质这个renderer的时候就不能常规的来。

这里有两种方式,一种是直接把Guard那个拽到我们的脚本中,让我们获取的object是角色的mesh部分,而不是角色整体,这样直接get组件就ok了。

当然还有一种方法,我们在character直接get,是找不到skinnedXXX的,我们要考虑到他的儿子里面是否有这个,那么需要:

这么写。

然后获取材质面板的属性信息,我们首先需要知道要获取的属性的类型。

他这里都是按照类型进行分类的。

然后需要传入名称。

注意是带有下划线的名字。

这里是set。

修改后的颜色,这里使用Unity内置的颜色。

或者是这样写。

然后我们如果想要实现被击打后的闪白效果,那么这里就是修改颜色之后,再修改回来,但是中间的时间控制,我们需要协程。

==========================================================================================================================

注意游戏内闪白,其他的东西不能受影响啊,意思是闪白的那一瞬间,其他的物体应该正常继续走程序。所以这里就涉及到多线程的思路。这里就是使用协程,但是他真实情况并不是多个线程,只是一个类似的做法。

这里框住的俩东西是写死的,还有那个奇怪的返回方式也是写死的,然后上边就是start一个协程 ,那开启的协程干什么?就是Wait方法,他的返回值是写死的。

然后这里是等待两秒之后执行下面的log语句。

这里就是先1马上3再过2秒1.

----------======================================================================================================================

上边完成了对于变量的修改和改回来。但是对于溶解那种效果是需要变量逐渐变化的,而不是两个值之间没有过渡的变化的。所以我们需要动画过渡/

这里的yield就是类似让协程挂起暂停的意思,然后后边加上waitForSecond表示暂停多少秒,也可以有其他的选择,比如暂停到下一帧等等的,当后面的暂停所指定的时间结束之后,就会继续往下执行程序。

这里deltaTime指的是两帧之间的时间间隔。

然后上边的yield return null其实啥也不干,就是相当于暂停0s,继续执行,我们想要退出协程:

整一个随着时间进行插值即可。

在点击中毒过程中的时候点击闪白,他俩之间会有一些冲突,所以我们可以按照上边,进行另外一个协程之前,先把别的协程给关掉,当然这里可以指定关闭某一个协程。StopCoroutines。

======================================================================

对于溶解效果,我们需要做两件事情,首先打开溶解的开关,然后随着时间调节clip。

对于shader中的range变量,其实本质还是float。

对于开启开关的时候,我们需要使用当时对应的宏关键字,不能使用变量名了。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值