• Unity笔记


    目录

    1.组件

    2.脚本的声明周期

    2.1脚本的执行顺序 

    3.图层分组 

    4.标量和向量

    4.1.向量的运算

    5.预设体

    5.3.变体:和预制体相同的参数会随之改变,独有的不改变

    6.欧拉角和四元数

    7.动态修改物体属性

    7.1.声明对象(游戏对象/预制体)并关联

    9.Application类

    10.场景

     10.2.同步加载

    10.3.异步加载

    11.transform类

    12.获取键鼠操作

    13.轴线

    14.触摸

    15.灯光

    15.1.光的类型(区域下面单独讲)

    16.相机

    17.设置音乐音效 

    18.设置视频播放

    19.使用角色控制器

    20.RigidBody刚体;受力影响

    21.碰撞 

    22.触发

    23.关节

    23.1.铰链关节(HingeJoint)

    23.2.弹簧关节(Springjoint)

    23.3.固定关节(FixedJoint)

    ​编辑

    24.物理材质(摩擦力和弹力)

    25.射线检测:获取点击位置

    26.粒子效果

    26.画线和拖尾

    ​编辑

    27.动画

    27.1.老版动画(Animation)

    27.2.新版动画(Animator) 

    27.3.动画控制 (使用Character Pack: Free Sample资源包)

     27.4.控制角色移动

    27.5.动画功能设置

    27.6.混合动画

    27.8.IK

    28.AI导航

    29. UI

    29.1.文本 和按钮

    29.2.输入框

    ​编辑 29.3. 选项(切换)组件

    29.4.下拉列表

    29.5.滑动条

    29.6.滚动条

    29.7.滚动视图

    29.8.画板

    29.9.适配UI的一些组价


    1.组件

    组件就是某一个物体的功能,不同的物体都是由空物体添加了不同的组件,例:正方体,灯光;

    点击物体,选择添加组件

    2.脚本的声明周期

     

    2.1脚本的执行顺序 

    1. 对象会依次执行所有脚本的Awake,OnEnable,Start....;
    2. 脚本的执行顺序按添加的顺序先入后出;

    打开脚本执行顺序:编辑--项目管理--脚本执行顺序

    3.图层分组 

    4.标量和向量

    • 标量:只有大小的量,例:1、100 、390;
    • 向量:有大小且有方向的量,例:前方100m;
    • 向量的模:向量的大小;
    • 单位向量:大小为1的向量;
    • 单位化,归一化:把向量转化为单位向量的过程;

    4.1.向量的运算

    A(x1,y1),B(x2,y2);

    • 加法:A+B = (x1+x2,y1+y2)
    • 减法:A-B = (x1-x2,y1-y2)
    • 点乘:A*B = x1x2 + y1y2 = n = |A||B|*cos&;
      • 点乘的意义:求出两者之间的夹角:n = cos&;

    5.预设体

    5.1.设置子物体:点击物体右击创建对象

    5.2.预设体:将物体拖拽至Assets,形成预制体

    • 改变预设体的参数,由预设体生成的对象的参数也会一同改变;
    • 改变预设体生成的对象的参数,可以通过改变位置的脚本的设置“应用到预制体”;

    5.3.变体:和预制体相同的参数会随之改变,独有的不改变

    • 将由预制体的生成的对象,修改参数拖拽到Aseets,选择预制体变体即可;

    6.欧拉角和四元数

    1. void Start()
    2. {
    3. //表示欧拉角
    4. Vector3 rotate = new Vector3(0, 30, 0);
    5. //四元数默认值为0的;
    6. Quaternion quaternion = Quaternion.identity;
    7. //欧拉角转四元数
    8. quaternion = Quaternion.Euler(rotate);
    9. //四元数转欧拉角
    10. rotate = quaternion.eulerAngles;
    11. //看向某一个位置
    12. quaternion = quaternion.LookRotation(new Vecter3(0,0,0));
    13. }

    7.动态修改物体属性

    1. //获取脚本所挂载的游戏物体,
    2. GameObject go = this.gameObject;
    3. Debug.Log(go.name);
    4. //直接使用gameObject也可以
    5. Debug.Log(gameObject.name);
    6. Debug.Log(gameObject.tag);
    7. Debug.Log(gameObject.layer);
    8. Debug.Log(cube.name);
    9. //当前真正的激活状态
    10. Debug.Log(cube.activeInHierarchy);
    11. //当前自身的激活状态
    12. Debug.Log(cube.activeSelf);
    13. //获取transform,这个组件可以直接获取
    14. Debug.Log(transform.position);
    15. Transform trans = this.transform;
    16. //获取其他组件 ,使用GetComponent;
    17. BoxCollider bc = GetComponent();
    18. //获取子对象的组件
    19. BoxCollider bcc = GetComponentInChildren();
    20. //获取父对象的组件
    21. BoxCollider bcp = GetComponentInParent();
    22. //添加组件
    23. gameObject.AddComponent();
    24. //通过名字来获取游戏对象
    25. GameObject tmp = GameObject.Find("Tmp");
    26. //通过标签来获取游戏对象
    27. //GameObject tmp = GameObject.FindWithTag("ENEMY");
    28. Debug.Log(tmp.name);
    29. //设置激活状态
    30. tmp.SetActive(false);
    31. //实例化预制体,并作为子物体存在
    32. Instantiate(prefab,transform);
    33. //实例化预制体
    34. //Instantiate(prefab, Vector3.zero,Quaternion.identity);

    7.1.声明对象(游戏对象/预制体)并关联

    • 在vs中声明对象,然后在unity中将对应物体拖拽至C#脚本对应位置

    8.获取时间

    1. float timer = 0;
    2. void Start()
    3. {
    4. //当前脚本执行的时间
    5. Debug.Log(Time.time);
    6. //时间缩放值
    7. Debug.Log(Time.timeScale);
    8. //固定时间间隔
    9. Debug.Log(Time.fixedDeltaTime);
    10. }
    11. void Update()
    12. {
    13. timer += Time.deltaTime;
    14. //上一帧到这一帧所花的时间
    15. //Debug.Log(Time.deltaTime);
    16. if(timer > 5.0)
    17. {
    18. Debug.Log("shijiancahoguo5miao");
    19. }
    20. }

    9.Application类

    1. //游戏数据文件(只读),加密
    2. Debug.Log(Application.dataPath);
    3. //持续化文件(写入保存数据),加密
    4. Debug.Log(Application.persistentDataPath);
    5. //配置文件,非加密
    6. Debug.Log(Application.streamingAssetsPath);
    7. //临时文件
    8. Debug.Log(Application.temporaryCachePath);
    9. //是否后台运行
    10. Debug.Log(Application.runInBackground);
    11. //访问网址
    12. //Application.OpenURL("https://www.bilibili.com/video/BV1gQ4y1e7SS?p=26&vd_source=dd33a133562c58424bf7e4dd3013ae0e");
    13. 退出
    14. //Application.Quit();

    10.场景

    • 游戏由多个场景构成,场景由多个游戏对象构成,游戏对象由多个组件构成;

    10.1.创建和添加废弃用场景

     10.2.同步加载

    • 加载其他场景默认是LoadSceneMode.Single;
    1. //有两个类:场景类和场景管理类
    2. //场景类
    3. //获取当前场景
    4. Scene scene = SceneManager.GetActiveScene();
    5. //场景名字
    6. Debug.Log(scene.name);
    7. //场景的路径
    8. Debug.Log(scene.path);
    9. //场景的索引
    10. Debug.Log(scene.buildIndex);
    11. //获取当前场景的所有游戏物体,打印数量
    12. GameObject[] goa = scene.GetRootGameObjects();
    13. Debug.Log(goa.Length);
    14. //场景管理类
    15. //创建一个新场景
    16. Scene newScene = SceneManager.CreateScene("NewScene");
    17. //当前的场景数量
    18. Debug.Log(SceneManager.sceneCount);
    19. //卸载场景
    20. SceneManager.UnloadSceneAsync("NewScene");
    21. //加载其他场景,切换
    22. SceneManager.LoadScene("MyScene",LoadSceneMode.Single);
    23. //加载其他场景,添加
    24. SceneManager.LoadScene("MyScene",LoadSceneMode.Additive);

    10.3.异步加载

    1. public AsyncOperation operation;
    2. void Start()
    3. {
    4. StartCoroutine(LoadScene());
    5. }
    6. //协程方法调用异步加载场景
    7. IEnumerator LoadScene()
    8. {
    9. operation = SceneManager.LoadSceneAsync(1);
    10. //加载结束不自动跳转
    11. operation.allowSceneActivation = false;
    12. yield return operation;
    13. }
    14. float timer = 0;
    15. void Update()
    16. {
    17. //当前加载进度 0-0.9
    18. Debug.Log(operation.progress);
    19. timer += Time.deltaTime;
    20. if(timer > 5)
    21. {
    22. Debug.Log("超过5秒,跳转场景");
    23. operation.allowSceneActivation = true;;
    24. }
    25. }

    11.transform类

    • transform类通常有两个作用:1.控制位置旋转缩放,2.控制父子关系
    1. void Start()
    2. {
    3. 常用的参数
    4. 获取世界位置
    5. //Debug.Log(transform.position);
    6. 获取本地位置
    7. //Debug.Log(transform.localPosition);
    8. 获取四元数旋转
    9. //Debug.Log(transform.rotation);
    10. //Debug.Log(transform.localRotation);
    11. 获取欧拉角
    12. //Debug.Log(transform.eulerAngles);
    13. //Debug.Log(transform.localEulerAngles);
    14. transform获取缩放
    15. //Debug.Log(transform.localScale);
    16. transform获取向量:前方、上方、右方
    17. //Debug.Log(transform.forward);
    18. //Debug.Log(transform.up);
    19. //Debug.Log(transform.right);
    20. //控制父子关系
    21. //获取父对象
    22. //GameObject parent = transform.parent.gameObject;
    23. //获取子对象,子对象有多个
    24. Debug.Log(transform.childCount);
    25. Transform child = transform.Find("Child");
    26. //按索引获取子物体
    27. transform.GetChild(0);
    28. //解除父子关系
    29. transform.DetachChildren();
    30. //判断是否是另一个物体的子物体
    31. Debug.Log(child.IsChildOf(transform));
    32. //设置为一个物体的子物体
    33. child.SetParent(transform);
    34. Debug.Log(child.IsChildOf(transform));
    35. }
    36. void Update()
    37. {
    38. //看向原点(0,0,0)
    39. //transform.LookAt(Vector3.zero);
    40. //旋转
    41. //transform.Rotate(Vector3.right, 3);
    42. //绕某一个物体旋转:点,轴,度数
    43. //transform.RotateAround(Vector3.zero, Vector3.right, 2);
    44. //移动
    45. //transform.Translate(Vector3.forward * 0.1f);
    46. }

    12.获取键鼠操作

    1. void Update()
    2. {
    3. //0-左键,1-右键,2-滚轮
    4. //按下右键
    5. if (Input.GetMouseButtonDown(1))
    6. {
    7. Debug.Log("按下了右键");
    8. }
    9. //持续按下右键
    10. if (Input.GetMouseButton(1))
    11. {
    12. Debug.Log("持续按下右键");
    13. }
    14. //抬起右键
    15. if (Input.GetMouseButtonUp(1))
    16. {
    17. Debug.Log("抬起右键");
    18. }
    19. //按下了A键
    20. if (Input.GetKeyDown(KeyCode.A))
    21. {
    22. Debug.Log("按下了A键");
    23. }
    24. //持续按下了A键
    25. if (Input.GetKey(KeyCode.A))
    26. {
    27. Debug.Log("持续按下了A键");
    28. }
    29. //抬起了A键
    30. if (Input.GetKeyUp(KeyCode.A))
    31. {
    32. Debug.Log("抬起了A键");
    33. }
    34. }

    13.轴线

     获取虚拟轴和虚拟按键

    1. void Update()
    2. {
    3. //获取虚拟轴
    4. float horizontal = Input.GetAxis("Horizontal");
    5. float vertical = Input.GetAxis("Vertical");
    6. Debug.Log(horizontal+" "+vertical);
    7. //获取虚拟按键
    8. if(Input.GetButtonDown("Jump"))
    9. {
    10. Debug.Log("空格");
    11. }
    12. }

    14.触摸

    1. void Start()
    2. {
    3. //开启多点触摸
    4. Input.multiTouchEnabled = true;
    5. }
    6. void Update()
    7. {
    8. //判断单点触摸
    9. if(Input.touchCount == 1)
    10. {
    11. //获取触摸
    12. Touch touch = Input.touches[0];
    13. //触摸位置
    14. Debug.Log(touch.position);
    15. //触摸阶段
    16. switch(touch.phase)
    17. {
    18. case TouchPhase.Began://开始
    19. break;
    20. case TouchPhase.Moved://移动
    21. break;
    22. case TouchPhase.Stationary://静止
    23. break;
    24. case TouchPhase.Ended://结束
    25. break;
    26. case TouchPhase.Canceled://取消
    27. break;
    28. }
    29. }
    30. //多点触摸
    31. if(Input.touchCount == 2)
    32. {
    33. Touch touch1 = Input.touches[0];
    34. Touch touch2 = Input.touches[1];
    35. }
    36. }

    15.灯光

    15.1.光的类型(区域下面单独讲)

    • 聚光类似一个手电筒
    • 定向光从某一个方向照射,只有改变旋转才能改变照射的方向
    • 点光类似一个灯泡

    15.2.灯光的参数选项

    • 实时灯光:实时计算阴影等,耗性能,烘焙灯光:把灯光贴图保存,删除灯光依然有灯光贴图
    • 软阴影:真实性好,耗性能

    15.3.区域灯光和烘焙 

    1.选择烘焙物体,设置为Contribute GI

    2.窗口-渲染-照明-生成灯光 

     

    3.会生成一个灯光贴图

    16.相机

    17.设置音乐音效 

    1. //声明音乐片段
    2. public AudioClip music;
    3. public AudioClip se;
    4. //声音组件
    5. private AudioSource player;
    6. void Start()
    7. {
    8. player = GetComponent();
    9. //设定播放片段
    10. player.clip = music;
    11. //设置循环
    12. player.loop = true;
    13. //音量
    14. player.volume = 0.5f;
    15. //播放
    16. player.Play();
    17. }
    18. void Update()
    19. {
    20. //点击空格停止音乐
    21. if(Input.GetKeyDown(KeyCode.Space))
    22. {
    23. if(player.isPlaying)
    24. {
    25. //暂停
    26. //player.Pause();
    27. //停止播放
    28. player.Stop();
    29. }
    30. else
    31. {
    32. //继续播放
    33. //player.UnPause();
    34. //从头开始播放
    35. player.Play();
    36. }
    37. }
    38. //播放一次音效
    39. if(Input.GetMouseButtonDown(0))
    40. {
    41. player.PlayOneShot(se);
    42. }
    43. }

    18.设置视频播放

    先创建渲染器纹理

    19.使用角色控制器

    1. void Update()
    2. {
    3. player = GetComponent();
    4. //水平轴
    5. float horizontal = Input.GetAxis("Horizontal");
    6. //垂直轴
    7. float vertical = Input.GetAxis("Vertical");
    8. //画一条方向的射线
    9. Vector3 dir = new Vector3(horizontal, 0, vertical);
    10. Debug.DrawRay(transform.position, dir, Color.black);
    11. //受重力影响
    12. player.SimpleMove(dir);
    13. //不受重力影响
    14. //player.Move(dir);
    15. }

    20.RigidBody刚体;受力影响

    21.碰撞 

    • 碰撞检测脚本写在碰撞的两物体任意一个;
    • 两个碰撞物体至少有一个有刚体组件,至少一个物体会受力的影响;

    当火焰与地面碰撞后,发生爆炸;需要给物体添加碰撞检测组件Collider

    检测碰撞

    1. //声明预制体
    2. public GameObject Prefab;
    3. void Start()
    4. {
    5. }
    6. void Update()
    7. {
    8. }
    9. //监听发生碰撞
    10. //参数为被碰撞物体的碰撞信息:被碰撞游戏对象等等
    11. private void OnCollisionEnter(Collision collision)
    12. {
    13. //发生碰撞,创建爆炸物体
    14. Instantiate(Prefab,transform.position,Quaternion.identity);
    15. //销毁火焰
    16. Destroy(gameObject);
    17. }
    18. //持续碰撞
    19. private void OnCollisionStay(Collision collision)
    20. {
    21. }
    22. //碰撞结束
    23. private void OnCollisionExit(Collision collision)
    24. {
    25. }

    销毁爆炸:将脚本挂载到爆炸预制体上,自动销毁

    1. //2s后销毁
    2. void Start()
    3. {
    4. }
    5. float timer = 0;
    6. void Update()
    7. {
    8. timer += Time.deltaTime;
    9. if(timer > 2)
    10. Destroy(gameObject);
    11. }

    22.触发

    • 触发和碰撞的区别:触发两个物体碰撞后会穿过物体
    • 也需要将其中一个物体设为刚体

    22.1.设置触发:在碰撞器组件设置是触发器

    发生触发,墙消失

    移动物体且添加刚体

    1. void Update()
    2. {
    3. //获取水平垂直轴
    4. float horizontal = Input.GetAxis("Horizontal");
    5. float vertical = Input.GetAxis("Vertical");
    6. //向量
    7. Vector3 Dir = new Vector3(horizontal, 0, vertical);
    8. //朝向量移动,乘以deltaTime从帧转为妙
    9. transform.Translate(Dir * 2 * Time.deltaTime);
    10. }

    设置是触发器 

    1. //参数为进入触发物体的碰撞器
    2. private void OnTriggerEnter(Collider other)
    3. {
    4. GameObject wall = GameObject.Find("Wall");
    5. //存在那么删除或者设置为非激活
    6. if(wall != null)
    7. {
    8. wall.SetActive(false);
    9. }
    10. }
    11. private void OnTriggerStay(Collider other)
    12. {
    13. }
    14. private void OnTriggerExit(Collider other)
    15. {
    16. }

    23.关节

    23.1.铰链关节(HingeJoint)

    • 在Physics中找

    23.2.弹簧关节(Springjoint)

    • 被连接的物体需要设置为刚体

    23.3.固定关节(FixedJoint)

    • 被连接的物体需要设置为刚体

    24.物理材质(摩擦力和弹力)

    • 动摩擦力<=静摩擦力

    创建一个物理材质

    物理材质添加到碰撞器的材质里面 

    25.射线检测:获取点击位置

    • 点击位置由相机的镜片面发生出;下图灰色的长方形

    1. void Update()
    2. {
    3. //鼠标点击
    4. if(Input.GetMouseButtonDown(0))
    5. {
    6. //鼠标点击发出射线,main为主相机,current为当前相机
    7. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    8. //声明一个碰撞检测类
    9. RaycastHit hit;
    10. //输出参数获取碰撞检测类
    11. bool res = Physics.Raycast(ray, out hit);
    12. if(res)
    13. {
    14. Debug.Log(hit.point);
    15. //移动到点击位置
    16. transform.position = hit.point;
    17. }
    18. }

    26.粒子效果

    26.画线和拖尾

    26.1.画线:添加Line Renderer组件

    1. void Start()
    2. {
    3. //获取LineRenderer组件
    4. LineRenderer lr = GetComponent();
    5. //设置点的个数
    6. lr.positionCount = 3;
    7. lr.SetPosition(0, Vector3.zero);
    8. lr.SetPosition(1, Vector3.one);
    9. lr.SetPosition(2, Vector3.up);
    10. //Vector3[] vector3s = { Vector3.zero, Vector3.one, Vector3.up };
    11. //lr.SetPositions(vector3s);
    12. }

    26.2.拖尾

    • 组件在Effect中TrailRenderer

    27.动画

    27.1.老版动画(Animation)

    27.1.1.制作简易动画

    可以使用关键帧的方法录制或者使用录制模式

    27.2.新版动画(Animator) 

    将创建的动画控制器拖拽至Animator组件的控制器

    点开动画控制器的界面,如下

    如老版动画一样创建动画

    27.3.动画控制 (使用Character Pack: Free Sample资源包)

    27.3.1.资源包的构成

    27.3.2设置过渡条件

    1. void Update()
    2. {
    3. //点击鼠标左键角色触发wave动作
    4. if(Input.GetMouseButtonDown(0))
    5. {
    6. Animator animator = GetComponent();
    7. animator.SetTrigger("wave");
    8. }
    9. }

     27.4.控制角色移动

    下面属性控制:动画切换速度,越小切换越快切换看起来更生硬

    1. void Update()
    2. {
    3. //获取垂直水平轴
    4. float horizontal = Input.GetAxis("Horizontal");
    5. float vertical = Input.GetAxis("Vertical");
    6. Vector3 Dir = new Vector3(horizontal, 0, vertical);
    7. //如果点击了方向键WSAD,那么Dir不可能为0
    8. if(Dir != Vector3.zero)
    9. {
    10. //旋转方向等同于看向这个方向
    11. transform.rotation = Quaternion.LookRotation(Dir);
    12. //切换到Run动画
    13. GetComponent().SetBool("IsRun", true);
    14. //以旋转方向,直接向前移动
    15. transform.Translate(Vector3.forward * 2 * Time.deltaTime);
    16. }
    17. else
    18. {
    19. //切换到idle动画
    20. GetComponent().SetBool("IsRun", false);
    21. }
    22. }

    27.5.动画功能设置

    介绍:无:无动画;旧版:使用Animation组件的动画;泛型:使用Animator的非人动画;人形:使用Animator的人形动画;

    27.5.1曲线

    • 使用场景:比如随着动画时间,将生成火焰,火焰的大小可以由曲线数值来设置
    • 曲线和参数的名字相同,旧可以使用Animatior组件的GetFloat获取数值
    Debug.Log(GetComponent().GetFloat("Curve"));

    27.5.2.事件

    • 使用场景:当动画到某一帧时,例如左脚着地将发出脚步声; 
    • 关联:添加事件后,挂载在物体上的任意脚本写出对应函数即可;
    1. void LeftFoot()
    2. {
    3. Debug.Log("左脚着地");
    4. }
    5. void RightFoot()
    6. {
    7. Debug.Log("右脚着地");
    8. }

    27.6.混合动画

    • 根据float类型的参数,决定播放两个动画的明显程度;

    27.7.遮罩

    27.7.1.遮罩

    • 只覆盖所选中的身体部位 
    • 图层的权值决定覆盖程度,列表下面为新(Wave Layer),新覆盖旧

    27.7.2.动画分类

    • 创建一个子状态机,同一类动画放在一起;
    • 创建一个新图层,同一类动画放在一起;

    27.7.3.3个状态

    • 所有状态:连接动画,此动画将可以被所有动画过渡
    • 入口状态:会从这个状态开始
    • 退出状态:返回入口状态

    27.8.IK

    • 身体的部位看向或指向某一个位置

    1. private void OnAnimatorIK(int layerIndex)
    2. {
    3. Animator animator = GetComponent();
    4. //设置头部IK
    5. animator.SetLookAtWeight(1);//设置权重
    6. animator.SetLookAtPosition(target.transform.position);//设置位置
    7. //设置其他部位都使用以下函数
    8. //设置位置和位置权值
    9. animator.SetIKPositionWeight(AvatarIKGoal.LeftHand, 1);
    10. animator.SetIKPosition(AvatarIKGoal.LeftHand, target.transform.position);
    11. //设置旋转和旋转权值
    12. animator.SetIKRotationWeight(AvatarIKGoal.LeftHand, 1);
    13. animator.SetIKRotation(AvatarIKGoal.LeftHand, target.transform.rotation);
    14. }

    28.AI导航

    28.1.设置导航

    28.2.移动起来

    • 添加导航代理组件
    1. using UnityEngine.AI;
    2. public class NavAgent : MonoBehaviour
    3. {
    4. private NavMeshAgent agent;
    5. void Start()
    6. {
    7. //获取组件
    8. agent = GetComponent();
    9. }
    10. void Update()
    11. {
    12. if(Input.GetMouseButtonDown(0))
    13. {
    14. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    15. RaycastHit hit;
    16. if(Physics.Raycast(ray, out hit))
    17. {
    18. //设置为导航目标点
    19. agent.SetDestination(hit.point);
    20. }
    21. }
    22. }
    23. }

    28.3.动态障碍物(动态烘焙)

    28.4.设置跳跃高度和距离

    28.5.传送阵

    28.6.成本

    29. UI

    创建UI画布,同是会自动创建事件系统

    UI画布设置

    添加图像

    锚点

    29.1.文本 和按钮

    • 旧版都要使用Using UnityEngine.UI,新版都需要使用Using TMPro;

    按钮 

    29.2.输入框

     29.3. 选项(切换)组件

    29.4.下拉列表

    使用脚本添加

    1. void Start()
    2. {
    3. TMP_Dropdown dropdown = GetComponent();
    4. //获取选择表
    5. List options = dropdown.options;
    6. //修改选项;
    7. options.Add(new TMP_Dropdown.OptionData("乌兰巴托"));
    8. //dropdown.options = options;
    9. }

    29.5.滑动条

    29.6.滚动条

    29.7.滚动视图

    29.8.画板

    29.9.适配UI的一些组价

    1.mask:添加Mask组件,子物体超出部分被遮盖

    2.content size fiitter:自动控制文本垂直/水平

    • 垂直适应:选择Preferred size(选择大小)

    3.vertical/horizontal/grid layout group:控制画板上的物体(垂直、水平、网格)间隔 

    • 挂载在画板上
    • 挂载在滚动视图的content上

  • 相关阅读:
    CC1链详解
    Chapter9:Simulink建模与仿真
    知乎好物推荐怎么做赚钱?该如何做?
    【CSS】object-fit 和 object-position 属性详解
    【Fiddler】安卓7.0以上添加Fiddler/Charles证书到系统根证书(模拟器-雷电)
    Layui快速入门之第三节栅格布局
    【Spring MVC】MVC如何浏览器请求(service方法)
    AVR单片机开发11——1602液晶屏幕
    高薪程序员&面试题精讲系列147之你熟悉哪些加密算法(上篇)?如何保证项目的安全性?
    Python 推导式和递归
  • 原文地址:https://blog.csdn.net/m0_72964546/article/details/138554018