/yuxiuyan/p/7565345.html
一、组件和脚本介绍
1. 组件
组件,顾名思义,就是游戏对象的组件。
这与我们对现实生活的理解是一致的。 例如一台主机由CPU、显卡、主板、内存条等组成。 这些部分是主机的“组件”。 一旦对这些组件不满意,可以随时进行增删改查。
Unity3D是一个“组件”游戏引擎,它使用各种组件来“组装”游戏对象,最终将游戏对象组装成游戏。
上图是Plane的内置组件。
Unity3D 为我们提供了多种组件。 后期其实就是各种组件的用途和特点,以及它们能达到的功能和效果。
按照我们祖先的理论,五行是构成世界的最基本的元素。 那么在Unity3D中,组件是构成游戏世界的最基本元素。
我总结了上面这张图,很重要,需要大家仔细看看。 因为这涉及到游戏对象与脚本中的类、对象之间的联系。
2.变换组件
这是最基本的组件之一 - Transform 组件。
Transform,中文为“变换”,该组件具有三个基本属性,Position(世界位置坐标)、Rotation(相对于自身坐标系的旋转角度)、Scale(相对于初始缩放比例)。
该组件是每个游戏对象的属性,无法删除。 其实仔细想想,在现实生活中,只要是物体,就一定有方向、旋转、缩放等属性。
通过修改这三个属性的X\Y\Z值,我们可以控制对象的“变形”信息。 这是一个小技巧。 当你把鼠标放在X\Y\Z上时,鼠标变成了一个可以左右拖动的符号,可以直接左右拖动改变数值。 当然直接修改值也是可以的。
3.脚本
脚本(Script)unity触发器调用,即为游戏对象编写的代码,用于控制游戏的逻辑。 Unity3D 5.x之后,只支持C#脚本和JavaScript脚本。 国内主流的C#开发。
4. 创建和管理脚本
我们说过,Assets文件夹是管理器,所以我们在Assets中新建一个Scripts文件夹来管理脚本资源。
右键单击脚本文件夹 --> 创建 --> C# 脚本。 C#脚本文件的后缀为“.cs”。 双击脚本文件调用代码编辑器进行编辑。
5. 原脚本代码构成
上一步我们新建了一个脚本,这次打开看看是什么。
好了,我们看到这次unity为我们新建了一个类,类名就是我们脚本文件的名字。 然后它继承自MonoBehaviour类。 这个类在unity中的地位和作用类似于java中的Object类,重要性不言而喻。
有兴趣的童鞋可以去看看这个类的实现。 你可以看看这篇文章:。
还可以看到这个脚本使用了UnityEngine引擎。 然后unity还帮我们写了两个方法Start()和Update()。
Start():游戏开始时,该方法会立即执行,并且只会执行一次。 从这个角度来看,这种方法非常适合初始化工作。 其实也是这样的。 我们经常会在这个方法中做一些GetComponent()操作。
Update():循环调用,每帧一次。 我粗略测了一下,一般场景每秒60次左右。
这里还有一个方法要介绍一下:Debug.Log()。 这用于调试输出。 如果你的目标是“helloworld”,好吧,这个方法就是这样做的。
顺便说一句,Start()和Update()都是Unity内部的“事件方法”,我们不需要手动调用它们,系统会自动调用和管理这些方法。
6.使用脚本
运行游戏,脚本会自动执行。
这是一个 first.cs 脚本:
使用统一引擎;
使用系统。 收藏品;
公共课第一:MonoBehaviour {
无效开始(){
Debug.Log("这是启动方法");
}
无效更新(){
Debug.Log("这是更新方法");
}
}
加入灯光,运行游戏,控制台效果:
2.鼠标键盘输入
以上我们已经知道了C#脚本的大致套路。 说起写代码是各位童鞋的强项。 这次我们实现游戏来读取我们的输入。
Unity已经好心的给我们写好了方法,我们只需要调用这些接口就可以了。
1.获取键盘输入
案例如下:
使用统一引擎;
使用系统。 收藏品;
公共类 InputTest :MonoBehaviour {
无效更新(){
如果(输入。GetKey(KeyCode。A))
{
Debug.Log("按下了一个键");
}
如果(输入。GetKeyDown(KeyCode。A))
{
调试。 日志(“GetKeyDown”);
}
如果(输入。GetKeyUp(KeyCode。A))
{
调试。 日志(“GetKeyUp”);
}
}
}
2.获取鼠标输入
直接上方法
用法和监听键盘输入类似,这里就不写代码示例了
3.使用transform组件移动游戏对象
鼠标键盘监听控件上面说了,Transform组件也说了。 我们可以使用脚本将两者结合起来,让游戏对象通过键盘移动!
备注:脚本也可以看成是组件。 一般是脚本挂载在哪个对象上,控制哪个游戏对象。
这是一个例子:
使用统一引擎;
使用系统。 收藏品;
公开课 StudentMove : MonoBehaviour
{
私有转换反式;
//使用这个进行初始化
无效开始()
{
trans = 游戏对象。 获取组件();
}
// Update 每帧调用一次
无效更新()
{
如果(输入。GetKey(KeyCode。W))
{
trans.Translate(Vector3.forward * 0.1f, Space.World);
}
如果(输入。GetKey(KeyCode。A))
{
trans.Translate(Vector3.left * 0.1f, Space.World);
}
if (Input.GetKey(KeyCode.S))
{
trans.Translate(Vector3.back * 0.1f, Space.World);
}
如果(输入。GetKey(KeyCode。D))
{
trans.Translate(Vector3.right * 0.1f, Space.World);
}
}
}
将这个脚本拖到游戏对象的Inspector面板中,然后点击游戏的“运行”按钮,可以发现我们已经可以通过W\A\来控制对象的前后左右移动了键盘的 S\D 键! 惊人的!
4. 物理组件刚体
上面我们通过Transform组件实现了物体位置的移动,但是仔细研究后发现有以下特点:
看似物体在动,但又不是真实的,与我们的现实生活有很大的不同。
《愤怒的小鸟》大家应该都听过或者玩过。 小鸟的抛物线运动和石头的崩塌,都符合物理定律。
我们说过组件是构成游戏对象的构建块。 因此,我们需要其他组件来使对象遵守物理定律。
1.刚体
Rigidbody 属于物理组件。 添加了刚体组件的游戏物体会产生重力,会做自由落体运动,实现了真实物体的物理运动。
选择游戏对象-->菜单栏,点击Component-->Physics-->Rigidbody,给对象添加一个刚体组件就成功了!
2.公共属性
看上图,我们来看看它的几个常用属性。
质量[quality],可以设置物体的质量,可以把单位想成KG。
阻力【阻力】,一般指空气阻力,0表示没有空气阻力,空气阻力越大,物体自由落体越慢。 当该值很大时,物体甚至会停止移动并漂浮在空中。
Angular Drag [角阻力],空气受到扭转力时的阻力,0表示没有阻力,值大时,物体甚至会停止运动。
使用重力[使用重力]。 勾选时,如果物体掉出场景,就会坠入“深渊”。
3.在脚本中使用刚体组件移动游戏对象
直接进入脚本:
使用统一引擎;
使用系统。 收藏品;
公共类 RigidbodyMove:MonoBehaviour
{
私有转换反式;
私人刚体刚体;
//使用这个进行初始化
无效开始()
{
trans = 游戏对象。 获取组件();
刚性 = 游戏对象。 获取组件();
}
// Update 每帧调用一次
无效更新()
{
如果(输入。GetKey(KeyCode。W))
{
rigid.MovePosition(trans.position + Vector3.forward * 0.1f);
}
如果(输入。GetKey(KeyCode。A))
{
rigid.MovePosition(trans.position + Vector3.left * 0.1f);
}
if (Input.GetKey(KeyCode.S))
{
rigid.MovePosition(trans.position + Vector3.back * 0.1f);
}
如果(输入。GetKey(KeyCode。D))
{
rigid.MovePosition(trans.position + Vector3.right * 0.1f);
}
}
}
代码很简单,却实现了像真实物体一样的物理运动,很神奇。
5.物理组件的对撞机
1.对撞机
上面使用刚体组件的对象可以与场景中的其他对象产生碰撞效果。 其实有一个专门负责与目标物体碰撞的组件,就是碰撞器组件(Collider)。
也就是说,我们控制的对象A和对象B的碰撞本质上是对象A和对象B的碰撞体组件之间的交互。
碰撞体可以理解为我们模型的“外骨骼”。
这是没有移动的原始立方体。
屏蔽物体的渲染器(取消勾选上面的Renderer),看看物体的碰撞体是什么样子的:
显示的是Cube外层的碰撞体组件。
只要我们创建了一个物体,unity就会默认为我们添加一个collider组件。 没有对撞机的刚体是没有意义的3D场景,失去了刚体应有的物理特性。
换句话说,物理由 Rigidbody 组件和 Collider 组件一起表示。
其实这对“同志好朋友”的故事有很多很多unity触发器调用,大致概括一下。
对撞机组件按形状大致可分为以下几类。
2. 盒子对撞机
Box Collider,外形呈立方体,用于包裹箱体模型,如箱子、门、房屋等。 有几个共同的属性:
Is Trigger:设置是否为触发器。 这个属性很重要,后面会经常用到触发器。
材料:物理材料。
center:碰撞器也可以设置中心点。 一般来说,碰撞体的中心点就是物体的几何中心点。
尺寸:设置物体“外骨骼”的尺寸。
3. 球体对撞机
spherical collider和上面的box collider基本类似,Radius就是半径。
4. 胶囊对撞机
胶囊对撞机与球形对撞机具有相似的属性,方向是指设置其高度的方向。
5. 网格对撞机
网格碰撞器,用于包裹具有复杂结构的模型
Mesh:根据指定的mesh生成碰撞体。
6.刚体常用方法介绍
有了组件,就必须有新的方法。
1. 加力()
作用:给刚体一个力,使刚体按“世界坐标系”运动。
其中,ForceMode为力模式,为枚举类型,决定了如何给刚体加力。
使用统一引擎;
使用系统。 收藏品;
公共类 ForceTest:MonoBehaviour
{
私人刚体刚体;
无效开始()
{ // 获取对象的刚体组件
刚性 = 游戏对象。 获取组件();
}
无效更新()
{ //相对于世界坐标系给刚体施加一个向前的力
rigid.AddForce(Vector3.forward, ForceMode.Force);
}
}
2. 添加相对力()
作用:给刚体加一个力,使刚体按“自身坐标系”运动。
由此我们可以知道AddForce()和AddRelativeForce()非常相似。 它们其实是双胞胎,只不过一个是相对于世界坐标系,一个是相对于自身坐标系。
3.固定更新()
这是一种固定的更新方法。 这个方法值得一说。 网上的资料挺多的,大家不要瞎扯了~
Update()方法每帧刷新一次,但时间间隔不确定。 FixedUpdate() 方法以固定时间间隔(默认为 0.02 秒)刷新。
这个值可以自己设置。 编辑-->项目设置-->时间-->固定时间步长。
基本上,物理相关操作的代码都写在 FixedUpdate() 方法中。 如果写在Update()中,会出现卡顿现象。
7. 刚体碰撞事件监控与处理
一、碰撞事件简介
什么是“碰撞事件”? 当由刚体控制的对象与另一个对象发生碰撞时,会触发碰撞事件。
注意:目标对象必须有 Collider 组件。
碰撞
比如在一个射击游戏中,我们发射了一颗子弹,它是一个由刚体控制的物体。 子弹击中了敌人,我们如何监控这次碰撞?
2. 碰撞事件监测方法
这个 Collision 参数是什么?
这是一类“碰撞”,用于传递碰撞信息。
Collision.gameObject 属性,对与当前对象发生碰撞的对象的引用。
gameObject.name 属性游戏动态,当前对象的名称。
上面的代码示例:
使用统一引擎;
使用系统。 收藏品;
公共类 CollisionCube:MonoBehaviour {
void OnCollisionEnter(碰撞碰撞)
{
如果(coll.gameObject.name !=“地面”)
Debug.Log("输入" + coll.gameObject.name);
}
无效 OnCollisionExit(碰撞科尔)
{
如果(coll.gameObject.name !=“地面”)
Debug.Log("退出" + coll.gameObject.name);
}
无效 OnCollisionStay(碰撞科尔)
{
如果(coll.gameObject.name !=“地面”)
Debug.Log("留下来" + coll.gameObject.name);
}
}
8.刚体触发事件监听及处理
一、触发事件介绍
在collider组件上选择Is Trigger选项,当前游戏对象的collider组件就变成了一个触发器。
我想每个人都应该理解“触发器”的概念。
注意:移动的刚体物体将穿透选中“Is Trigger”选项的对撞机。
当刚体控制的对象进入另一个对象的触发范围内时,就会产生触发事件。
这并不直接与目标物体发生碰撞(接触),而是只要进入目标物体的“触发范围”就可以进行一定的操作。
那么如何设置“触发范围”呢? 其实和我们上面设置碰撞体范围的方法是一样的。
2.触发事件监听方法
这个 Collider 参数是什么?
这是一类“碰撞器”,用于传递触发信息。
Collision.gameObject 属性,进入触发范围内目标对象的引用。
gameObject.name 属性,当前对象的名称。
使用统一引擎;
使用系统。 收藏品;
公共类 TriggerCube:MonoBehaviour {
void OnTriggerEnter(对撞机科尔)
{
Debug.Log (coll.gameObject.name+"on trigger enter");
}
void OnTriggerStay(对撞机科尔)
{
Debug.Log(coll.gameObject.name+"on trigger stay");
}
void OnTriggerExit(对撞机科尔)
{
Debug.Log (coll.gameObject.name+"on trigger exit");
}
}
9. 游戏打包发布
那么,当我们制作了一个游戏之后,我们如何将它发布到各个平台呢?
这实际上很容易。 untiy 已经为我们做了大部分的事情。
要做的事情:
1.构建设置[构建设置]
2.播放器设置【详细设置】
三、产品介绍
一个exe文件,一个data文件夹,缺一不可。
10. 入门总结
这一阶段,我们从最简单的组件和脚本开始,介绍了鼠标和键盘的交互,如何移动物体,学习了刚体、碰撞器和几个常用的方法,还学习了打包和发布。
那么unity的基本操作就差不多结束了。 虽然还有很多东西没有介绍,但我们在制作demo的过程中再学习再用。 上面介绍的所有方法和属性我也写了一个思维导图文件,缩略图:
详细地址: 链接: 密码:8xq0
用什么开发《王者荣耀》系列游戏
看完这篇文章你有什么收获吗?欢迎转发分享给更多的人
关注“DotNet”并提高您的 .Net 技能