您现在的位置是:首页 >其他 >Unity --- 枪类与子弹类的设计初探 与 Physics Material网站首页其他

Unity --- 枪类与子弹类的设计初探 与 Physics Material

Metallic Cat 2023-05-20 08:00:02
简介Unity --- 枪类与子弹类的设计初探 与 Physics Material

1.类的设计方法 --- 首先将不同的对象相同的行为和方法做到一个类A中,然后再给每个对象各创建一个类,并且都继承大类A,同时在自己的类中创建自己独有的方法或者属性

1.一般子弹的射击都是用射线检测的方式去做的 --- 用碰撞器会出现我们不想要的物理效果,用触发器的话子弹速度过快会导致触发失效的问题

2.如果想让满足分部位造成不同伤害的话,就需要给被伤害对象的每个部位都套一个对应的碰撞器,某一个部位检测到碰撞了就让这个部位调用对应的碰撞方法造成不同的伤害。

3.给不同的部位加碰撞器也是有讲究的:

一个游戏模型是由不同部位的子物体组成的,当我们要添加碰撞器时,需要做的就是给这些代表不同部位的子物体再添加一个空子物体,这个空子物体中只有两个组件 ---Transfrom表示位置,以及Collider --- 最关键的碰撞器

这种做法就能够保证当代表不同部位的子物体运动起来时,作为这些子物体的子物体的“碰撞器”也会跟着一起运动。

4.一个类为子类,它里面有一个方法从返回类型,函数名到函数参数都与父类相同,此时通过子类中对象调用该方法,那么应该执行的是子类中该方法还是子类继承的父类方法呢?

答:会优先执行子类中该方法

5.public --- 大家都能调用,protected --- 自己和自己的子类能调用(父类不可以),private --- 只有自己能调用

1.目前我们掌握的获取游戏资源的方式有两招:

a.创建一个公开变量,然后将与变量类型相对应的游戏资源拖到Inepector界面处为对应公开变量生成的赋值框

b.上面这种方式需要人手动操作,很不方便,因此我们可以升级为通过代码来查找和载入游戏资源

 2.Resource类中有一个方法 --- Load载入方法 --- 方尖框内放资源的类型,括号内传资源的路径 --- 目录1目录2...资源名称(PS:还有一个前提还是资源必须放在Resource文件夹下,也正是因为这个规定,所以Resource不用写入目录中) --- 方法会返回我们想找的游戏资源对象,此时我们需要将其传给对应的引用,用引用来管理游戏资源(PS:此时只是找到了游戏资源!并没有在游戏场景中创建它

3.如果想要在游戏场景中创建游戏资源的话还需要调用 ---- Instantiate()方法 --- 参数是我们要创建的游戏资源(必须是GameObject类)

 

 1.资源路径示例 --- 如EffectsEnemy的资源路径是:ContactEffectsEffectsEnemy --- 由于资源一定要在Resource文件夹下,所以Resource不需要写入目录


介绍一下 --- 物理材质 --- Physics Metarial 

1.创建了物理材质之后,会出现上面这么几个属性 --- 由上到下分别是:动态摩擦力,静态摩擦力,弹力,摩擦力合并,弹力合并。

2.这两个属性的取值的意思如下:(以Bounce Combine为例)

当两个物体相互接触时,物体受到的弹力 = Bounce Combine --- 若为Average则表示两个物体的弹力平均,Min就是选弹力最小的游戏物体,Multiply指受到的弹力等于二者的弹力相乘,Max则是受到的弹力是二者之间弹力的最大值

(Fiction Combine同理)

Physics Material 物理材质属性位于Coliider碰撞器组件处 

1.由于用触发器作判定会比较消耗性能,我们一般不会随便用触发器来作判定,适用的场景一般有:a.触发范围的图形比较难用代码来形容(不好用距离来进行判定),此时直接用触发器做个触发范围图形,直接用判定就可以了

(PS:通常用来代替触发器判定的是两个游戏物体之间的距离判定)

1.this.transform.forward获取的是一个向量 --- 这个向量是位于世界坐标系的 ,向量的方向与游戏物体自身坐标系的Z轴正反向一致,向量的起点为世界坐标系的原点,向量的大小为1

1.如果说通过一个类创建的对象在游戏中只有一个,且这个对象经常会被其他的对象调用的话,我们可以通过 ---- 直接在类中提供类的对象引用来提高代码的简洁和易读性

具体的方法如上:

a.在类中创建一个具有公开权限的,该类的静态属性 (PS:属性的get 和 set也是能够设置访问权限的)

这段代码是指这个属性是大家都可以读取,但是只有类内部自己可以设置的,如果想要在外部进行设置的话,需要我们提供公开的接口方法

(1.创建一个类的对象 --- 调用构造函数 --- 构造函数的函数名为类名 ---一般都是通过引用来管理对象 --- 如 Play me(创建引用) = new Play() (创建对象的同时将对象赋值给引用))

b.创建了类的对象后,将对象赋值给静态引用进行管理

通过上面这一操作能够实现的好处:可以直接通过类名加静态引用来访问到这个唯一对象的各种属性和方法,而不需要去查找到这个对象,然后再创建个引用指向它,然后再通过引用来调用属性和方法。

节省了很多的不必要操作。只有一个对象,那就提前创建好引用,然后所有人只找这个引用,不需要自己再创建引用去找对象,岂不美哉


1.一个个脚本/组件就相当于一个个类,一个新创建的,空的游戏物体就相当于一个空对象集

2.补充射线检测方法的一个参数 --- 这个参数的类型是 -- L ayerMask

这个参数决定了射线能够在哪一个层中进行检测

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。