首先了解unity相关概述,快速认识unity编辑器,然后抓住重点的学:游戏对象、组件|C#脚本、预制体、UI
☺ 学习过程你会发现,其实Unity中主要是用c#进行开发。
因为在这个过程中,无非就是,对游戏对象通过挂载的C#脚本,修改一下组件的一些属性,控制一下激活之类的操作。到了UGUI,同样,也是通过挂载的C#脚本,监听到事件发生后,调用一下C#脚本定义的方法处理一下事件。
unity、visual studio
Unity是一套具有完善体系与编辑器的跨平台游戏开发工具,也可以称之为游戏引擎游戏引擎是指一些编写好的可重复利用的代码与开发游戏所用的各功能编辑器Unity目前已超过50%的游戏引擎市场占有率。
游戏引擎=可复用代码+各种开发工具
易上手、高安全性
的特性面向组件
游戏开发思想让游戏开发更加简单易复用所见即所得开发编辑器
良好生态圈
,商城中包含大量成熟的功能脚本与资源管理Unity项目,当电脑中有多个unity不同版本的项目的时候,管理就比较麻烦,可以通过unity hub 对各个不同的unity hub项目管理。
进入手的模式,快捷方式,直接按住鼠标滚轮
和右键-眼睛环绕一样,都是为了更好地全面观察游戏对象
在unity 中将图片、模型文件[后缀是.fbx]等素材进行打包
打包完的文件类型是 Unity package file
组件就是功能,需要给游戏对象添加什么功能就只需给它添加上组件。
在Unity中,游戏物体是不具备任何功能的,如果想要为其添加功能,那么就需要为它添加该功能的组件,而每一个组件其实就是一个引擎内部的组件脚本
或是由自己编写的组件脚本
。也就是说,一个游戏物体(GameObject)会包含多个组件(Component),每一个组件又是一个组件脚本。
每个游戏对象之所以表现形式不同,是因为绑定到他们身上的组件脚本不同!
▪ 激活OnEnale和取消激活OnDisable:
如果有多个脚本,test1.cs、test2.cs、test3.cs
脚本的执行顺序是:会想把test1.cs、test2.cs、test3.cs 的所有Awake方法执行完[如果有手动写Awake方法的情况!],接着是从test1.cs到test2.cs最后到test3.cs 执行下一个生命周期-激活OnEanale[如果有手动写OnEanale方法的情况!],然后又是从从test1.cs到test2.cs最后到test3.cs 执行下一个生命周期Start......
▷ 现阶段的生命周期从Awake开始,每次都是从项目中第一个脚本到最后一个脚本,执行。
▷ 接着进入下一个生命周期,所有的脚本也是从项目中第一个脚本到最后一个脚本,执行当前的生命周期!
如果想要更改项目中脚本之间的生命周期的执行顺序,可以在编辑->项目设置->脚本执行顺序设置一下
预制件变体:对当前的游戏对象,生成一个变体,变体会依赖旧的预制体。
当旧的预制体发生改变,变体也会跟着一起改变。但是变体改变,预制体不会发生改变。
using System.Collections; using System.Collections.Generic; using UnityEngine; /** * EmptyTest 类是绑定在场景SamepleScene下的游戏对象Empty身上 * 补充,课外小知识,C#的 Debug.Log 方法,其实就是相当于 前端项目的 console.log 方法,也就是开发过程中用于打印日志的 */ public class EmptyTest : MonoBehaviour { public GameObject Cube; //预制体 public GameObject Prefab; // Start is called before the first frame update void Start() { //当前类的属性gameObejct就对应了unity当前脚本所绑定的游戏对象 GameObject gameObject = this.gameObject; Debug.Log("gameObject: " + gameObject); Debug.Log("gameObject的名称:" + gameObject.name); Debug.Log("gameObject的标签:" + gameObject.tag); Debug.Log("gameObject的图层:" + gameObject.layer); Debug.Log("Empty下的Cude的name:" + Cube.name);//子物体的名称 Debug.Log("Empty下的Cude的继承的父类的激活状态:" + Cube.activeInHierarchy);//子物体继承关系的激活状态【看所继承的父物体的激活状态】 Debug.Log("Empty下的Cude的自身的激活状态:" + Cube.activeSelf);//子物体自身的激活状态 Debug.Log("Empty的transform:" + transform.position);//位置 Debug.Log("Empty下的Cude的transform:" + transform.Find(Cube.name).position);//位置 //给游戏对象添加上组件,通过拿到游戏对象.AddComponent方法 gameObject.AddComponent<MeshFilter>(); Cube.AddComponent<AudioSource>(); //获取其他组件【这个其他组件,其实就是排除掉Transform这个必须的组件后的其他组件】 Debug.Log("Empty获取其他组件:" + GetComponent<BoxCollider>()); Debug.Log("Cube获取其他组件:" + Cube.GetComponent<BoxCollider>()); //从子物体身上获取组件 // GetComponentInChildren<BoxCollider>(); //从父物体身上获取组件 //GetComponentInParent<BoxCollider>(); //全局查找--细节,就是首字母大写了,小写的是属性 //所谓的全局查找,其实就是对当前的C#脚本所处的场景SamepleScene下进行全局查找 GameObject testGameObject = GameObject.Find("TestGameObject"); //还可以通过标签名获取到游戏对象 GameObject testGameObejct2 = GameObject.FindWithTag("enemy"); Debug.Log("testGameObject:" + testGameObject); Debug.Log("testGameObject2:" + testGameObejct2); //还可以设置游戏对象是否激活 testGameObject.SetActive(false);//取消激活 //需求:通过预制体,在场景中实例化出游戏对象 //预制体的类型也是GameObject // Instantiate(Prefab); // 实例化出游戏对象,并且是当前挂载了C#脚本的游戏对象的子物体 GameObject capsule = Instantiate(Prefab, transform); // 销毁游戏对象 Destroy(capsule); } // Update is called once per frame void Update() { } }
游戏对象的父子级关系,其实是通过transform 维持的
......
GUI:Graphical User Interface 图形用户界面或图形用户接口。
GUI,是平面的,在2d下操作
UI 最基本的是 画布Canvas
,相当于屏幕。
UI 另外最基本的是 事件系统EventSystem
,其实就是把很多常见的事件,比如点击事件,封装起来。
第一层的子控件做适配:
锚点是设置在父物体身上的。
控件锚点的作用:控件永远会和锚点保持一定的距离。
① 在画布Canvas 下添加UI-Button,在项目下创建一个C#脚本,然后把C#脚本挂载到Button身上
② 接着在C# 方法,写一个点击事件发生时的处理方法 BtnClick()
③ 最后在Button 组件下面的On Click() 添加上C# 脚本中,点击事件发生时的处理方法 BtnClick()
如果本文对你有帮助的话记得给一乐点个赞哦,感谢!