其他分享
首页 > 其他分享> > unity笔记(1)

unity笔记(1)

作者:互联网

/// <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 onm ouseDown()
    {
        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 
     */
}

 

标签:--,物体,GUILayout,笔记,unity,查找,private,组件
来源: https://www.cnblogs.com/xms-669/p/15988883.html