ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

unity笔记(1)

2022-03-10 12:00:56  阅读:144  来源: 互联网

标签:-- 物体 GUILayout 笔记 unity 查找 private 组件


/// <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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有