1. Component类
(1)获取单个组件 GetComponent()
获取当前GameObject上指定类型的组件,如果不存在则返回null。
// 获取当前物体上的Rigidbody组件
Rigidbody rb = GetComponent<Rigidbody>();
// 使用示例:如果存在刚体则禁用重力
if (rb != null)
{
rb.useGravity = false;
Debug.Log("已禁用重力");
}
(2)获取多个组件 GetComponents()
获取当前GameObject上所有指定类型的组件(包括禁用的组件)。
// 获取所有Collider组件
Collider[] colliders = GetComponents<Collider>();
// 禁用所有碰撞体
foreach (var collider in colliders)
{
collider.enabled = false;
}
(3)获取自身或子物体组件 GetComponentInChildren()
GetComponentInChildren() 会先在当前游戏对象上查找组件,如果没找到才会在子物体中查找(只返回第一个找到的)。
// 获取子物体的第一个MeshRenderer(当前物体没有MeshRenderer)
var chilaRed = this.GetComponentInChildren<MeshRenderer>();
// 进行参数修改
chilaRed.material.color = new Color(1, 0, 0);
(4)获取自身和子物体组件 GetComponentsInChildren()
获取当前GameObject及其所有子物体中指定类型的所有组件。
// 获取自身和子物体上所有的MeshRenderer组件
var chilaRed = this.GetComponentsInChildren<MeshRenderer>();
// 进行参数修改
foreach (var component in chilaRed)
{
component.material.color = new Color(1, 0, 0);
}
(5)获取自身或父物体组件 GetComponentInParent()
GetComponentInParent() 会先在当前游戏对象上查找组件,如果没找到才会在父物体中查找(只返回第一个找到的)。
(6)获取自身和子物体组件 GetComponentsInParent():
获取当前GameObject及其所有父物体中指定类型的所有组件。
2. Transform类
(1)position / localPosition
获取或设置世界/局部空间中的位置。
// 设置世界坐标位置
transform.position = new Vector3(1, 2, 3);
// 设置局部坐标位置(相对于父对象)
transform.localPosition = new Vector3(0.5f, 0, 0);
(2)localScale / lossyScale
localScale:物体相对于父物体的局部缩放值(在父物体的坐标系中)。
lossyScale:物体在全局坐标系中的最终缩放值(受所有父物体层级缩放影响的叠加结果)。
localScale | lossyScale | |
---|---|---|
坐标系 | 父物体的局部空间 | 世界空间 |
可修改性 | 可直接修改 | 只读 |
受父物体影响 | 否 | 是 |
计算复杂度 | 直接读取 | 需要遍历父物体层级计算 |
旋转敏感度 | 不受旋转影响 | 旋转和非均匀缩放可能导致误差 |
(3)Translate()
按指定的方向和距离移动物体。
// 沿自身坐标系的z轴移动一米
this.transform.Translate(0, 0, 1,Space.Self);
// 沿世界坐标系的z轴移动一米
this.transform.Translate(0, 0, 1,Space.World);
(4)Rotate() / RotateAround()
Rotate():应用一个旋转。
RotateAround():围绕一个点旋转物体。
// 绕自身坐标系旋转
this.transform.Rotate(0, 0, 1, Space.Self);
// 绕世界坐标系旋转
this.transform.Rotate(0, 0, 1, Space.World);
// 绕某个点的某个轴旋转
this.transform.RotateAround(new Vector3(0, 0, 0), Vector3.forward, 10);
(5)SetParent()
设置父对象,可选择保持世界位置。
// 设置父对象并保持世界位置
this.transform.SetParent(newParent, true);
// 设置父对象并重置局部位置
this.transform.SetParent(newParent, false);
(6)Find()
按名称查找子对象。
// 查找名为"Arm"的子对象
Transform arm = transform.Find("Arm");
// 查找嵌套子对象
Transform hand = transform.Find("Arm/Hand");
3. GameObject类
(1)激活状态
// 获取对象自身的激活状态
bool isSelfActive = this.gameObject.activeSelf;
// 获取对象在层级中的实际激活状态
bool isActuallyActive = this.gameObject.activeInHierarchy;
// 设置游戏对象的激活状态
this.gameObject.SetActive(true);
this.gameObject.SetActive(false);
(2)组件操作
添加组件到游戏对象。
// 添加Rigidbody组件
Rigidbody rb = gameObject.AddComponent<Rigidbody>();
// 添加并配置组件
Light light = gameObject.AddComponent<Light>();
light.type = LightType.Point;
light.intensity = 2.0f;
获取附加的组件。
// 获取组件
Rigidbody rb = GetComponent<Rigidbody>();
// 获取子对象上的组件
Collider childCollider = GetComponentInChildren<Collider>();
// 获取所有Collider组件
Collider[] colliders = GetComponents<Collider>();
// 获取所有子对象上的Renderer组件
Renderer[] renderers = GetComponentsInChildren<Renderer>();
// 获取所有父对象上的脚本
MyScript[] scripts = GetComponentsInParent<MyScript>();
(3)查找操作
按名称查找游戏对象。不建议使用Find(),性能消耗较大。
// 查找名为"Player"的游戏对象
GameObject player = GameObject.Find("Player");
// 查找带路径的对象
GameObject child = GameObject.Find("ParentObject/ChildObject");
通过标签查找游戏对象。
// 查找单个带有"Player"标签的对象
GameObject player = GameObject.FindWithTag("Player");
// 查找所有带有"Enemy"标签的对象
GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
查找特定类型的对象或组件。
// 查找场景中第一个Camera组件
Camera mainCam = FindObjectOfType<Camera>();
// 查找所有Light组件
Light[] lights = FindObjectsOfType<Light>();
// 查找所有自定义脚本实例
MyScript[] scripts = FindObjectsOfType<MyScript>();
4. Object类
(1)查找操作
FindObjectOfType() 查找场景中指定类型的对象。
void FindGameControllers() {
// 查找第一个匹配的对象
GameController controller = FindObjectOfType<GameController>();
if (controller) {
controller.Initialize();
}
// 查找所有匹配的对象
Enemy[] allEnemies = FindObjectsOfType<Enemy>();
Debug.Log($"Found {allEnemies.Length} enemies in scene");
}
FindObjectsOfType() 查找场景中所有指定类型的对象。
void DisableAllLights() {
// 查找所有灯光并关闭它们
Light[] lights = FindObjectsOfType<Light>();
foreach (Light light in lights) {
light.enabled = false;
}
// 包含非激活对象
Enemy[] allEnemies = FindObjectsOfType<Enemy>(true);
Debug.Log($"Total enemies (including inactive): {allEnemies.Length}");
}
(2)销毁操作
Destroy() 销毁 Unity 对象。
public GameObject objectToDestroy;
public float delay = 2f;
void Start() {
// 立即销毁
Destroy(objectToDestroy);
// 延迟销毁
Destroy(gameObject, delay);
// 销毁组件
Destroy(GetComponent<Rigidbody>());
}
5. Time类
time:获取从游戏开始到现在的时间(秒),受时间缩放影响。
void Update() {
// 输出游戏运行时间
Debug.Log("游戏已运行: " + Time.time + "秒");
// 5秒后执行某个操作
if (Time.time > 5f) {
DoSomething();
}
}
deltaTime:获取上一帧到当前帧的时间间隔(秒),受时间缩放影响。
void Update() {
// 平滑移动物体(每秒移动5单位)
transform.Translate(Vector3.forward * 5f * Time.deltaTime);
// 旋转物体(每秒旋转90度)
transform.Rotate(Vector3.up * 90f * Time.deltaTime);
}
unscaledTime:不考虑时间缩放的游戏运行时间。
void Update() {
// 显示真实时间计时器(即使游戏暂停)
timerText.text = "计时: " + Time.unscaledTime.ToString("F2");
}
unscaledDeltaTime:不考虑时间缩放的帧间隔时间。
void Update() {
// UI动画,即使游戏暂停也要继续
float progress = Mathf.PingPong(Time.unscaledTime, 1f);
loadingBar.fillAmount = progress;
}
timeScale:时间缩放系数(0=暂停,1=正常,>1=加速)。
// 暂停游戏
void PauseGame() {
Time.timeScale = 0f;
}
// 恢复游戏
void ResumeGame() {
Time.timeScale = 1f;
}
// 慢动作效果
void SlowMotion() {
Time.timeScale = 0.3f;
}
// 加速效果
void SpeedUp() {
Time.timeScale = 2f;
}