初面网初面网

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唤醒刚体

碰撞检测与触发检测

碰撞有三种状态:碰撞时、碰撞中、碰撞结束

触发也有三种:触发时、触发中、触发结束

// 碰撞三态 与 触发三态
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){}

  // 和碰撞三态的特征相似
}

碰撞射线

单射线检测

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);
  }
}

多射线检测

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);
}

更新于 2025/2/26