Unity物理系统主要有三个组件:碰撞箱Collider,刚体RigidBody和平台控制器PlatformEffector
前期复习:
一般的游戏对象都自带一个公共基类Monobehavior,而后者又有层层往上的父类Component以及GameObject。分别提供了Destroy()、Instantiate()和getcomponent()等许多非常有用的方法。
Unity提供的Input类可以让我们很好的处理键盘输入。其中GetKeyDown()指的是当键盘的键被按下时触发、GetKeyUp()指的是当键盘的键被抬起时触发,GetKey()指的是当键盘的键被按住时,每帧执行的方法。
Unity还提供了自带的Random库,在不同的情境下都可以提供有效的随机值
Unity2D 物理组件
Tag
Tag是一个字符串变量,每一个游戏对象都有对应的标签。他主要的作用是:
1.判断一个物体是不是属于一个类
2.找到某个类的一个物体(使用FindGameObjectWithTag()方法)
Layer
Layer是一个整型变量,每个GameObject也都有一个layer。它可以用来给GameObject进行另外一种分组,从而实现:
1.让相机只渲染一些Layer(spriterenderer)
2.让物理运算只在一些Layer中进行
Collider2D
碰撞箱定义了一个物体的碰撞体积,但是想看到真实的物理模拟效果,还需要添加RigidBody组件。Collider2D有很多种形状,包括Box,circle,capsule,edge。
Collider组件有两种行为模式:Collider(有物理体积)和Trigger(无物理体积)。
Collider常用的方法有三个,其中OnCollidsionEnter2D()在刚碰撞到时触发一次,而OnCollisionExit2D()指在刚离开时触发一次,OnCollisionStay2D()指在接触期间每帧触发。这三个方法都有对应的Trigger版本。这些方法都有一个参数,表示碰撞信息。主要有三种常用成员:
collision.collider:对方的碰撞箱
collision.contacts:接触点的位置
collision.gamObject:对方的gameObject
RigidBody
RigidBody一般给物体处理除了碰撞之外的所有物理行为。有3种行为模式:
1.Dynamic完全参与物理模拟
2.Kinematic不会主动移动
3.Static不移动
常用的参数:
Gravity Scale,受到重力的大小
Constraints:锁定位移/旋转
Material:控制弹力和摩擦
LayerMask
LayerMask是一个整型变量,代表了一些layer的集合。因为int是32位的,刚好代表了Unity中layer的最大层数。可以使用1<<n表示第n层的LayerMask
射线检测Raycast
Physics2D.Raycast()往某个方向发出一根射线,碰撞到第一个物体就可以停止。
例子:检测可移动范围。
发出射线的一方不需要有碰撞箱,但是被碰撞的一方需要碰撞箱。
可以使用Input.GetAxis()方法获得键盘输入;
实现简单的移动、跳跃。
左右移动:声明初始化instance实例,使用transform.translate(v3)来表示移动。如果是横板,可以令y=z=0,x = Input.GetAxis("Horizontal")*speed*DeltaTime()或者使用rigidbody.velocity = (x*speed,0)来改变自设的速度属性。
跳跃(横板)可以使用rigidbody.AddForce(velocity)。这里需要Raycast添加IsGround判定,因为不能多段跳。
Platform Effector控制器
应用实例:常见的平台跳跃。勾选Used by Effector选项。
但是这个只能实现从下往上跳不被影响。如果希望在平台上时按下S可以下平台,需要另外的操作。(后期再补)