Appearance
Transform、射线、刚体
Transform
transform组件是每个游戏物体必有的。Transform类可以访问transform组件。
属性方法 | 详解 |
---|---|
position | 在世界坐标系中的位置 |
rotation | 在世界坐标系中的旋转 |
eulerAngles | 在世界坐标系中的欧拉角旋转 |
localPosition | 相对于父物体的位置旋转缩放 |
localRotation | 相对于父物体的旋转 |
localScale | 相对于父物体的缩放 |
localEulerAngles | 相对于父物体的欧拉角旋转 |
forward | 在世界坐标系中的自身坐标系的蓝色轴向量 |
up | 在世界坐标系中的自身坐标系的绿色轴向量 |
right | 在世界坐标系中的自身坐标系的红色轴向量 |
LookAt | 旋转物体使forward向量指向目标点,即看向某个目标点 |
Rotate | 旋转物体 |
RotateAround | 绕着某点旋转物体 |
Translate | 在某一方向与距离上进行移动 |
childCount | 当前Transform的子Transform个数 |
parent | 当前Transform的父Transform |
DetachChildren | 解除所有子Transform的关联 |
Find | 查找对应子Transform |
GetChild | 得到对应子Transform |
IsChildOf | 是否为子Transform |
SetParent | 设置父Transform |
脚本控制刚体
属性方法 | 详解 |
---|---|
position | 刚体的位置 |
rotation | 刚体的旋转 |
velocity | 刚体的速度 |
AddForce | 向刚体添加一个力 |
AddExplosionForce | 向模拟爆炸的刚体添加一个力 |
AddTorque | 向刚体添加一个扭矩 |
MovePosition | 移动刚体 |
MoveRotation | 旋转刚体 |
IsSleeping | 是否在休眠状态 |
Sleep | 让刚体进入至少一帧的休眠 |
WakeUp | 唤醒刚体 |
碰撞检测与触发检测
碰撞有三种状态:碰撞时、碰撞中、碰撞结束
触发也有三种:触发时、触发中、触发结束
csharp
// 碰撞三态 与 触发三态
public class NewBehaviourScript: MonoBehaviour{
// 碰撞时
private void OnCollisionEnter(Collision collision){}
// 碰撞中
private void OnCollisionStay(Collision collision){}
// 碰撞结束
private void OnCollisionExit(Collision collision){}
// 三个方法的特征是,On开头,紧跟Collision用来表示这是个碰撞相关的方法,然后跟着三个状态:Enter/Stay/Exit
// 触发时
private void OnTriggerEnter(Collider other){}
// 触发中
private void OnTriggerStay(Collider other){}
// 触发结束
private void OnTriggerExit(Collider other){}
// 和碰撞三态的特征相似
}
碰撞射线
单射线检测
csharp
void Update(){
// 方式1:从屏幕(摄像机)一点向游戏世界发射一条射线,该射线常用于检测鼠标指针有没有选择游戏物体
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 方式2:创建一个点到一个方向的射线
// Ray ray2 = new Ray(Vector3.zero, Vector3.up);
// 声明一个射线碰撞信息类
RaycastHit hit;
// 进行碰撞检测并返回结果,检测信息会写入碰撞信息类中
bool res = Physics.Raycast(ray, out hit);
// 如果产生了碰撞
if(res){
// 进行碰撞代码的编写,这里输出了碰撞点;运行后鼠标指针在游戏视图中指向的游戏物体就会看到碰撞坐标输出
Debug.Log(hit.point);
}
}
多射线检测
csharp
void Update(){
// 从屏幕射出射线
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
// 声明一个碰撞信息数组
RaycastHit[] hits;
// 射线检测,并返回所有的碰撞信息
hits = Physics.RaycastAll(ray);
hits = Physics.RaycastAll(Vector3.zero,Vector3.up,100);
// 添加射线检测的距离设置
hits = Physics.RaycastAll(ray,100);
hits = Physics.RaycastAll(Vector3.zero,Vector3.up,100);
// 只与第10个图层上的物体碰撞
hits = Physics.RaycastAll(ray,1000,1<<10);
hits = Physics.RaycastAll(Vector3.zero,Vector3.up,1000,1<<100);
}