/// <summary>
/// Component 类 提供了查找组件的功能(从自身、从后代、从先辈)。
/// </summary>
public class ComponentDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("将当前物体颜色设置为红"))
{
GetComponent<MeshRenderer>().material.color = Color.red;
}
if (GUILayout.Button("获取当前物体所有组件"))
{
var allComponent = GetComponents<Component>();
foreach (var item in allComponent)
{
Debug.Log(item);
}
}
if (GUILayout.Button("获取所有子物体中的MeshRenderer"))
{
var allRenderer = GetComponentsInChildren<MeshRenderer>();
foreach (var item in allRenderer)
{
item.material.color = Color.red;
}
}
if (GUILayout.Button("获取所有先辈物体中的MeshRenderer"))
{
var allRenderer = GetComponentsInParent<MeshRenderer>();
foreach (var item in allRenderer)
{
item.material.color = Color.red;
}
}
/*
GetComponent:获取当前物体其他组件类型的引用。
GetComponents:获取当前物体所有组件引用。
GetComponentsInChildren:查找指定类型组件(从自身开始,并搜索所有后代)
GetComponentInChildren:查找指定类型组件(从自身开始,并搜索所有后代,查找到第一个满足条件则结束)
GetComponentsInParent:查找指定类型组件(从自身开始,并搜索所有先辈)
*/
}
}
public class GameObjectDemo : MonoBehaviour
{
/*
GameObject 类
-- Variables
activeInHierarchy :理解为物体实际激活状态(物体自身被禁用或者父物体被禁用都为false)
activeSelf:物体在Inspector面板激活状态
layer
-- Public Functions
AddComponent:为游戏对象添加组件
SetActive
-- Static Functions
* Find :根据名称查找游戏对象(慎用,如同大海捞针)
* FindGameObjectsWithTag :获取使用指定标签的所有物体
* FindWithTag:获取使用标签的一个物体
*
* Object 类 Static Functions
*
* 总结:
* 如何查找某个组件引用
* Component 类
* -- 实例方法
* -- 查找当前物体其他类型组件引用
* -- 在先辈物体中查找指定类型组件引用
* -- 后代
*
* Transform 类
* -- 实例方法
* -- 通过名称查找子物体
* -- 索引
*
* GameObject 类
* -- 静态方法
* -- 通过标签查找物体(单个、所有)
* -- 通过名称找物体(慎用)
* -- 实例方法
* -- 查找当前物体其他类型组件
* -- 在先辈物体中查找指定类型组件引用
* -- 后代
*
* Object 类
* -- 静态方法
* -- 根据类型查找对象
*
//练习:(1)代码创建红色的聚光灯
// (2)点击按钮启用/禁用指定物体
*
* 作业:查找血量最低的敌人
*/
public GameObject targetGO;
private void OnGUI()
{
if (GUILayout.Button("代码创建红色的聚光灯"))
{
//创建游戏对象
GameObject go = new GameObject("MyLight");
//添加灯光组件(创建Ligth类型对象 将引用添加到游戏对象列表中)
Light light = go.AddComponent<Light>();
light.type = LightType.Spot;
light.color = Color.red;
}
if (GUILayout.Button("启用/禁用指定物体"))
{
targetGO.SetActive(!targetGO.activeInHierarchy);
}
if (GUILayout.Button("FindGameObjectsWithTag"))
{
//获取所有敌人
var allEnemy = GameObject.FindGameObjectsWithTag("Enemy");
var playerGO = GameObject.FindWithTag("Player");
}
if (GUILayout.Button("FindObjectsOfType"))
{
//无论当前组件位于哪个物体,都可以被查找到
var allRenderer = FindObjectsOfType<MeshRenderer>();
}
}
}
/// <summary>
/// 生命周期、消息、可重写函数、必然事件
/// </summary>
public class Lifecycle : MonoBehaviour
{
/*
c# 类
{
字段
属性
构造函数
方法
}
脚本
{
private/public 字段
方法
}
*/
//字段直接初始化(在构造函数中进行,调用Unity方法会产生异常)
//本质:跨线程访问被禁止
//解决方案:放到Start 或 Awake中
//private int a = Random.Range(1, 101);
private string a = "abc";
[Range(1,100)]
public int b = 10;
//在编译器中显示当前字段
[SerializeField]
private bool c = true;
//在编译器中隐藏当前字段
[HideInInspector]
public float d = 1.0f;
//***************生命周期*********************
//Unity脚本 从唤醒 到 最后销毁的过程。
//必然事件:当满足某种条件自动执行的方法。
//重点:执行时机、作用、方法名称
//(前提:物体启用、脚本启用)Unity 引擎会在一开始先调用所有对象的Awake 再调用 所有对象的 Start
//游戏物体加载 ---> 立即执行(仅1次)
//作用:充当构造函数,初始化数据成员。
// 如果初始化有明确的先后顺序,需要先执行的放到Awake中,后执行的放到Start中
private void Awake()
{
//Debug.Log(this.name + ":Awake:Lifecycle");
}
//游戏物体加载 ---> 等待脚本启用 --> 才执行(仅1次)
private void Start()
{
//Debug.Log(this.name + ":Start:" + Time.time);
}
private void OnMouseDown()
{
Debug.Log("执行喽");
}
//固定更新
//固定时间(默认0.02s) 执行 1次
//作用:对物体执行物理操作(移动、旋转、施加力……)
//
private void FixedUpdate()
{
//向前移动1m
}
//每渲染帧(大概0.02s) 执行1次
//作用:执行游戏逻辑
private void Update()
{
//向前移动1m
//查看某一帧程序执行情况
//启动调试 F5 --> 运行场景 --> 暂停 --> 在可能出错的行加断点 --> 单帧运行 --> 调试…… --> 停止调试 Shift + F5
int a = 1;
int b = 2;
int c = a + b;
}
//延迟更新:在Update之后执行
//作用:适合执行跟随Update移动的代码
private void LateUpdate()
{
}
}
/// <summary>
/// Transform 类 提供了查找(根据名字、索引获取子物体)、移动、旋转、缩放物体的功能。
/// </summary>
public class TransformDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("Find"))
{
//通过名称获取子物体变换组件引用
//this.transform.Find("子物体名称")
//备注:如果通过路径获取物体,那么路径一定不能发生改变
Transform childTF = this.transform.Find("子物体名称/子物体名称");
//通过变换组件查找其他类型组件
childTF.GetComponent<MeshRenderer>().material.color = Color.red;
}
if (GUILayout.Button("获取所有子物体(孙子不要)"))
{
//写法1
int count = transform.childCount;
for (int i = 0; i < count; i++)
{
//根据索引获取子物体
Transform tf = transform.GetChild(i);
}
//写法2
foreach (var child in transform)
{
//child子物体变换组件
}
}
if (GUILayout.RepeatButton("自转"))
{
//按下按钮 沿Y轴旋转1度
transform.Rotate(0, 1, 0);//沿自身坐标轴
//transform.Rotate(0, 1, 0,Space.World);//沿世界身坐标轴
}
if (GUILayout.RepeatButton("移动"))
{
//移动
transform.Translate(0, 0, 1);//沿自身坐标轴
//transform.Translate(0, 1, 0,Space.World);//沿世界身坐标轴
}
if (GUILayout.Button("LookAt"))
{
//注视旋转 物体Z轴指向目标位置
transform.LookAt(targetTF);
}
if (GUILayout.RepeatButton("围绕旋转"))
{
// (围绕的目标点,围绕的轴向,围绕的角度)
transform.RotateAround(targetTF.position, Vector3.forward, 1);
}
if (GUILayout.RepeatButton("设置父物体"))
{
//将当前物体 设置为 targetTF 的子物体
transform.SetParent(targetTF);
}
}
public Transform targetTF;
/*
Transform 类
-- Variables
childCount
localPosition:子物体相对于父物体坐标[编译器中显示的]
localScale:子物体相对于父物体的缩放比例[编译器中显示的]
lossyScale:(只读)可以理解为相对于模型的缩放比(父物体.localScale * 自身物体.localScale)
parent
position:相对于世界坐标系坐标
root
-- Public Functions
Find :通过名称查找子物体.
GetChild:根据索引获取子物体
LookAt
Rotate
RotateAround
SetParent
Translate
*/
}