1.课程前面、学习方法、学习需要的基础
学习方法:其实就是一个经验积累的问题,最开始你要尝试学着去做7~8个小游戏,对游戏制作的大体流程还有代码功能的实现有一个初步的了 解,就是做完这些游戏,对Unity和Csharp语言有一个基本的认识,知道一些基本的使用方法,说什么也能很快的回想起来,脑子中有 很多或多或少的印象,最开始你自己可能只是知道一些基本的概念,初学就是这样,之后你就是需要不断的加深这种印象,直到你能 独立或者半独立的去做一些游戏。
学习需要的基础:已经做了10个左右或者更多小游戏的人
2.开发环境准备,如何查看Unity的API文档
1.Unity文档 官方英文在线教程 建议配合网易有道词典进行搭配使用
2.API手册 类和方法等等
3.什么是事件函数
1.例如Start和Update方法
2.Unity的事件函数(也叫做生命周期事件)
4.事件函数的执行时机和先后
当场景加载时:
Awake : 任何启动函数之前都被调用,并且在一个预制程序被实例化之后。(如果一个游戏对象在启动时不活动,直到它被激活时才会被调用。)
OnEnable : 只有在对象处于活动状态时才调用,对象被启用后调用
OnLevelWasLoaded : 这个函数被执行以通知游戏一个新的级别已经加载。
在第一个帧更新之前:
Start : 在OnEnable之后Update之前执行
第一帧运行 : (使用一帧,显示高亮暂停图形按钮)
OnApplicationPause
逐帧更新的顺序:
FixedUpdate : 固定更新事件,里面一般都是关于物理的运算
Update : 每帧更新一次
LateUpdate : 相机的移动和跟随主角
渲染:
OnBecameVisable/OnBecameInVisable : 进入屏幕,一般用于敌人出了屏幕之外的自身的销毁
协程:
yield WaitForSeconds : 在多少秒延迟后执行
当游戏物体销毁时:
OnDestroy : 当对象被销毁时调用
退出:
OnApplicationQuit : 当退出场景时调用,一般用于退出游戏
OnDisable : 当组件被禁用时调用
表叫常用的事件函数的具体执行先后顺序是:
Awake
OnEnable
Start
FixedUpdate
Update
LateUpdate
OnDisable
OnDestroy
5.Time类中的静态变量介绍
Time.deltaTime 每帧执行的时间(60分之一秒左右波动)
Time.time 从游戏开始到现在所用的时间
Time.Scale 默认为1 正常速度 为0 暂停游戏 0.5一半速度 一般用于游戏中的暂停功能
6.Time.deltaTime和Time.realTimeSinceStartup的使用
Time.deltaTime 每帧执行的时间(60分之一秒左右波动)
Time.time 从游戏开始到现在所用的时间
Time.Scale 默认为1 正常速度 为0 暂停游戏 0.5一半速度 一般用于游戏中的暂停功能
Time.realTimeSinceStartup 一般用于性能的时间测试 在测试的方法前加上realTimeSinceStartup,方法结束后也加上,相减,得到的是时间 差就是方法的运行时间
7.创建游戏物体的三种方法
1.第一种创建游戏物体的方式
GameObject go = New GameOnject("Cube"); //创建一个名为Cube的空游戏物体
2.第二种创建游戏物体的方式
GameObject.Instantiate(prefab/Transform); //实例化一个游戏物体,他可以是Transform类型和GameObject类型的
3.第三种创建游戏物体的方式
GameObject.CreatPrimitive(PrimitiveType.Cube); //创建一个基本的游戏物体,Cube,Sphere,Cylinder,Capsule...
8.如何给游戏物体通过代码添加组件
public GameObject m_prefabs;
GameObject go = new GameObject("GameObject");
go.AddComponent(); //给该游戏物体添加刚体组件
9.如何禁用和启用一个游戏物体
SetActive(true/false) //设置一个GameObject的激活状态
enable = true/false //也可以设置一个GameObject的状态
//俩者是有区别的,SetActive一般用于游戏物体,而enable一般用于设置组件的状态
10.GameObejct、Component和Object的千丝万缕的关系
//一个游戏由由多个场景组成(Scenes)
//一个场景又是由多个游戏物体组成(GameObject)
//一个游戏物体又是由多个组件组成实现不同的功能(Component)
//GameObject和Component都是对象,或者叫类(万物皆是对象和类)
//GameObject和Component都继承自UnityEngine.Object,而UnityEngine有继承自System.Obejct类
11.Object的静态方法
name //获取游戏物体的名字
Destroy //销毁某个游戏物体
DestroyImmediate //立刻某个游戏物体(不建议使用)
DontDestroyOnLoad //在下一场景加载前不要销毁某个游戏物体
FindObjectOfType //根据组件的类型获取到第一个检测到的组件
FindObjectsOfType //根据组件类型获取一组组件
Instantiate //实例化游戏物体
12.GameObejct的独有的属性和静态方法
//属性
activeInHierarchy //显示当前游戏物体的状态(如果父子级关系存在的游戏物体,只会显示父物体)
activeSelf //显示自身的状态(如果存在父子级关系的游戏物体,只会显示子物体即自身的状态)
layer //显示游戏物体的层
tag //显示游戏物体的tag标签
//静态方法只能通过类名进行调用
CreatPrimitive //创建基本的几何体
Find //根据游戏物体的名称遍历查找游戏物体(比较耗费性能)
FindGameObejctWithTag //根据游戏物体的Tag标签查找游戏物体
FindGameObjectsWithTag //根据游戏物体的Tag标签查找一组游戏物体
FindWithTag //根据Tag标签查找一个游戏物体
SetActive //设置游戏物体的状态
13.游戏物体间的消息接收和发送
BroadcastMessage //发送一个广播消息,通知此游戏物体和它所有的子物体执行某个方法
SendMessage //通知某个游戏物体身上的某个方法执行
SendMessageUpwards //通知此游戏物体的所有的上一级执行某个方法
//MonoBehaviour是指我们自己写的脚本※※※
14.获取组件的各种方法函数
GetComponent //获取游戏物体身上的某个组件
GetComponents //获取某个游戏物体身上的多个同一类型的组件
GetComponentsInChildren //获取此游戏物体的子物体身上的所有同一类型的组件(包括自身的组件)
GetComponentInChildren //获取第一个子物体的组件
GetComponentInParenet //获取父物体的组件(包括自身的组件)
GetComponentsInParent //获取所有父物体的组件(包括它自身)
15.MonoBehaviour总览
//MonoBehaviour继承自Behaviour
//Behaviour继承自Component
//Component继承自Object
16.MonoBehaviour中常用的变量
//属性
isActiveAndEnabled //组件是否处于激活状态
enabled = true/false //设置组件的状态
tag //例如transform.tag就是获取该组所在游戏物体的名字
gameObject //例如transform.gameObject就是获取到组件所在的游戏物体
transform //获取到该组件所在游戏物体的Tranform组件
name //获取到该组件所在游戏物体的名字
print //Debug.log的缩写,功能和Debug.log一样,但是只能在继承自MonoBehavoiur类的类中使用
//普通方法(函数)
Invoke //执行某个方法 可以指定执行的时机
IsInvoke //方法是否已经储备(或叫执行) 如果只调用一次,在Update中执行前会返回true,执行后返回false,如果重复调用就会一 //直返回true,因为要指向的方法一直在储备(先这么理解...- . -)
InvokeRepeating //重复执行某个方法 可以在参数中指定第一次执行的时机以及每隔多少时间重复调用
CancelInvoke //取消所有的Invoke函数
17.什么是协程如何执行?
//协程是返回值类型是IEnumrator
//使用yiled return返回
//例如要返回一个等待的时间就是yiled return WaitForSeconds();
//定义一个生成敌人的协程
IEnumrator SpawnEnemy() {
yiled return WaitForSeconds(Random.Range(5,15)); //每N秒生成一个敌人
print("生成敌人...")
StartCoroutine(SpawnEnemy());
}
//在Start方法中执行协程方法
void Start() {
StartCoroutine(SpawnEnemy()); //生成敌人
}
//协程如何执行
//协程是在不堵塞主线程的执行的情况下执行,它是一个独立出来的分支
//它和主程序几乎相并执行
//他和无条件分支的普通方法的执行不同,普通方法需要执行完才能回到主线程继续向下执行
18.使用Coroutine实现颜色动画渐变
//具体代码如下
public GameObejct Cube; //需要在编辑器中进行拖拽指定
void Update() {
if(Input.GetKeyDown(KeyCode.Space)) { //如果按下空格键
StartCoroutine(Fade()); //开始执行协程
}
}
IEnumrator Fade() { //定义一个协程
for(;;) { //for循环的死循环
Color color = Cube.GetComponent().material.color; //获得当前颜色
Color newColor = Colol.Lerp(color,Color.red,0.02f); //插值有当前颜色变成红色
color = newColor; //将逐渐改变的颜色赋值给当前颜色进行显示
yiled return new WaitForSeconds(0.02f); //等待0.02秒执行下一次渐变
if(Color.red.g - newColor.g) <= 0.01f) { //如果变为红色
break; //跳出循环,即结束渐变
}
}
}
19.Coroutine的开启与关闭
//开启和关闭协程俩种方法,开启和结束的参数必须是相同类型的
//第一种是直接将方法名传递过去,协程中的参数是字符串类型
//第二种是传递过去一个IEnumrator类型的参数
//例如我们先定义一个名为Fade的协程方法
//第一种:SatrtCoroutine("Fade")
StopCoroutine("Fade");
//第二种:
private IEnumrator ie;
void Start() {
ie = Fade();
SatrtCoroutine(ie);
StopCoroutine(ie);
}
IEnumratoe Fade() {
...........;
}
20.鼠标相关事件函数
//前提:偏好设置中的Trigger勾选,Collider的Trigger勾选
OnMouseDown //鼠标按下事件
OnMouseUp //鼠标抬起事件
OnMouseDrag //鼠标拖拽事件 让我想到了背包物品的拖拽 设置当前游戏物体的位置为鼠标位置...实现一个物品拖拽的功能
OnMouseEnter //鼠标进入事件
OnMouseExit //鼠标离开事件
OnMouseOver //鼠标经过事件
OnMouseUpAsButton //按钮事件 只有在此游戏物体身上按下,并且在此游戏物体身上抬起才会触发
21.Mathf里面的静态变量
//Mathf是一个工具类,它所有的成员必须通过类名进行调用
Mathf.Deg2Rag //角度转换为弧度
Mathf.Rag2Deg //弧度转换为角度
Mathf.PI //圆周率
Mathf.Epsilon //一个炒鸡小的小数
Mathf.Infinity //无限大的整数
Mathf.NegativeInfinity //无限小的整数
22.Mathf中的Clamp限定方法
Mathf.Abs //求绝对值
Mathf.Ceil //向上(大1的数)取整,返回的是一个float类型的数
Mathf.Floor //向下(小1的数)取整(例如10点多会取10,-10点多回去-11),返回一个float类型的数
Mathf.CeilToInt //向上(大1的数)取整,返回的是一个int类型的数
Mathf,FloorToInt //向下(小1的数)取整,返回的是一个int类型的数
Mathf.Clamp //将某个value限定在俩个值之间 一般用于Hp限定在0~100之间 例如Mathf.Clmp(hp,0,100);
Mathf.Clamp01 //将某个value限定在0~1之间 例如Mathf.Clamp01(value);
23.Mathf中的常用方法
Mathf.ClosetPowOfTwo //取得离2的平方最近的数字(例如30,则会取一个32的一个值)
Mathf.Max //取得最大值
Mathf.Min //取得最小值
Pow(f,p) //取得f的p次方
Mathf.Sqrt //取得参数的平方根
24.关于游戏开发中的插值运算
Mathf.Lerp(float a,floatb,float t); //插值运算 在a~b之间进行每帧t的插值 t是一个(0~1)之间的数 t的值会越来越小
25.使用MoveToWards做匀速运动
Mathf.MoveToWards(float a,float b,float t); //a是开始位置,b是结束位置,t是移动的距离
26.使用PingPong方法实现乒乓球的来回运动效果
Mathf.PingPong(float t,Max Value) //使其在0~Max之间运动 t可以是时间(Tim.deltatime) 例如SpaceShooting中的Mathf.Sin(Time.time)
27.关于Input输入类(按键,触摸相关检测)
总览 陀螺仪 Ime开头的方法是关于输入法的
28.Input.GetKeyxxx相关事件监测
Input.GetKey //一直按下 一直触发
Input.GetKeyDown //按下 只会触发一帧
Input.GetKeyUp //抬起 只会触发一帧
29.鼠标按键事件的监测
Input.GetMouseButtonDown //按下鼠标键触发 0代表左键 1代表右键 2代表中键
Input.GetMouseButton //鼠标持续按下 0代表左键 1代表右键 2代表中键
Input.GetMouseButtonUp //鼠标抬起触发 0代表左键 1代表右键 2代表中间
30.GetButtonXXX相关事件监测
虚拟按键(Input.GetButton("Shooting")) 虚拟按键的名字可以自己设置,它的功能触发键也可以自己设置
Input.GetButton //持续按下虚拟按键
Input.GetButtonDown //按下虚拟按键
Input.GetButtonUp //抬起虚拟按键
31.使用GetAxis得到的轴的变化来控制移动
Input.GetAxis //有一个加速减速的过程
Input.GetAxisRaw //匀速运动
32.屏幕坐标系和鼠标的坐标
Input.anyKeyDown //任意键按下(包含鼠标的左键和右键)
Input.MousePosition //鼠标在屏幕上的位置点(二维坐标(x,y)),左下角为原点(0,0)
33.Vector2的变量有哪些
Vector2.up 位置(1.0) 向上
Vector2.down
Vector2.left
Vector2.right
Vector2.zero
Vector2.magnitude 求得一个向量的长度(是求根号后的值)
Vector2.sqrMagnitude 求得一个向量长度的平方(不求根号!!!)
Vector2.normalized 长度归一化(如果一个向量的长度为10,那么就返回1) (Survival Shooting中的w和d键同时按下主角会加一点速度的案例)
34.向量是结构体
向量是结构体,是值类型,要整体赋值
35.二维向量Vector2中的静态方法
Vector2.Set 赋值
Vector2.Angle 返回俩个方向之间的角度
Vector2.Distance 返回俩个向量之间的距离
Vector2.Dot
Vector2.lerp 对俩个向量的xy进行插值
Vector2.Max Vector2.Min 返回俩个长度中最大/最小的向量
MoveToWards 从a向量移动到b向量,最后边的参数给一个每帧移动的距离(速度)
36.测试这些方法
//结构体的属性的使用必须声明一个变量进行使用 即new声明对象, .使用属性
37.关于三维向量Vector3
Vector3.Slerp 距离和角度都插值
38.对向量的加减乘除运算
比如说敌人的方向减去主角的方向,得到的是一个主角向敌人的方向
39.使用Random生成随机数
Random.Range //生成随机数
Random.Initstate //生成一个种子随机数,不同的种子会对应不同的随机数
40.其他生成随机数的方法介绍
Random.value //生成一个0~1之间的小数,比如生成一个颜色,0~1之间
Random.insideUnitCircle //在半径为1的圆内随机一个位置,如果想要半径变为5,则直接乘5就可以了(这个圆的范围是以xy为基准的)
Random.insideUnitSphere //在半径为1的球体内随机一个位置(是以xyz为基准的)
41.Quaternion四元数介绍以及和欧拉角的区别
Quaternion.identity //无旋转
欧拉角可以很直观的看到物体的旋转(x,y,z)
四元数有四个值(w,x,y,z)
42.Quaternion中的LookRotation方法
传递过来一个四元数作为LookRotation的参数,使物体的z轴和传递过来的方向保持一致
如果看向的物体的高度和看的物体的高度不一样,可以直接设置方向的y的值为0
当然旋转可以慢慢的旋转,下节介绍~
43.Quaternion中的Lerp和Slerp插值运算
Quaternion.Slerp(当前旋转a,目标旋转b,速度t(可以是Time.deltatime)) //关于角度的插值都用这个比较好用
Quaternion.Lerp //使用效果和Slerp效果差不多,但更推荐使用Slerp
44.使用刚体组件的MovePosition移动游戏物体
Rigidbody.centerOfMass //取得游戏物体的重心
Rigidbody.position //适用于突然将某个物体移动到一个地方
Rigidbody.position = Rigidbody.transform.position - Vector3.forward*Time.deltatime //向前移动
Rigidbody.MovePosition //更平滑的移动就是用MovePosition
45.Rigidbody.rotation通过刚体组件设置物体的旋转(rotation是一个四元数)
Rigidbody.rotation = Quaternion.identity //(示例)无旋转
//关于节约性能,使用刚体移动不需要额外计算碰撞,而使用Transform组件移动则需要额外进行碰撞检测
Rigidbody,MoveRotation //持续的旋转建议用这个
46.Rigidbody.AddForce控制运动
Rigidbody.AddForce //给物体施加一个力 这个力是由慢变快的!!!!
47.Camera类的学习和常用方法
获取MainCamera的几种方法:
1. mainCamera = Camera.main
2. mainCamera = GameObejct.FindGameObjectWithTag("MainCamera")
3. mainCamera = GameObject.Find("MainCamera");
4. 暂时想起来这几个,如果有其他的,再行添加~
Camera.main.ScreenPointToRay(Input.mousePosition) //从鼠标位置发射一条射线
RaycastHit hitInfo; //存储碰撞信息
Ray ray = Camera.main.ScreenPointToRay(new Vector3(200,200,0));
Debug.DrawRay(ray.origin,ray.direction * 10,Color.yellow); //向目标位置发射一条黄色射线 direction是上面的参数 ray.origin是屏幕的起点
48.通过Application获取datapath(难道读取本地存档??!)
StreamingAssets //此文件夹中的文件不会被编译,存储的什么格式在文件夹中就是什么格式
Application.dataPath //资源文件夹的根目录,即Assets
Application.streamingAssetsPath //获取StreamingAssets文件夹路径
49.Application的常用静态变量和静态方法
Application.Quit //退出游戏
//静态变量
Application.identifier
Application.companyName //公司名称
Application.productName //产品名称
Application.isPlayer //是否在运行
Application.platform //哪个平台
Application.version //游戏版本
UnityEditor.EditorApplication.isPlaying = false; //退出游戏 之前的Application.isPlaying废弃了
50.如何切换加载场景(using UnityEngine.SceneManagerMent)
SceneManager.LoadScene() //参数可以是索引和字符串
//老师这里使用的Application类下的方法
Application.LoadLevel() //弃用的,最好不要用了,会在之后的版本移除
SceneManager //专门管理场景的一个类,它的命名空间是SceneManagement
SceneManager.LoadSceneAsync 加载场景,会返回一个AsyncOperation类型的对象
AsyncOperation.progress //取得加载场景的进度 制作进度条
51.关于SceneManager的其他方法
SceneManager.sceneCount //获取场景的数量
SceneManager.GetActiveScene //获取当前的场景
//还有很多关于切换获取场景删除场景的相关的API.....
52.射线检测之基本使用
Ray ray = new Ray(transform.position + transform.forward,transform.forward); //参数中第一个是位置,第二个是方向
bool isCollider = Physics.Raycast(ray);
53.射线检测的其他重载方法
Ray ray = new Ray(transform.position + transform.forward,transform.forward);
RaycastHit hitInfo;
bool isCollider = Physics.Raycast(ray,out hifInfo);
Debug.Log(hitInfo.collider.gameObject); //获取到碰撞到的游戏物体
Debug.Log(hit.point); //获取碰撞点
如果想要射线无限长度,可以在长度那里设置为Mathf.Infinity(表示一个无限大的数)
LayerMask.GetMask("Floor",...,...); //获取到要碰撞的层,可以同时传递多个层
54.关于2D射线检测和检测碰撞游戏物体
Physics2D.Raycast() //有7个重载
Physics.RaycastHitAll会检测所有的碰撞到物体,就是使射线具有了穿透功能
55.通过拖拽的方式监听UGUI事件
指定一个游戏物体,指定游戏物体脚本上的某个方法
56.通过代码添加对UGUI控件的事件监听
public GameObject nameOfGameObejct;
nameOfGameObject.GetComponent().OnClick.AddListener(this.FunctionName);
57.跟鼠标相关事件的接口实现
using UnityEngine.UI;
using UnityEngine.EventSystems;
在MonoBehaviour,IPointerDownHandler ->点击灯泡实现接口 创建方法->点击图片会执行该方法
Raycast Target 必须勾选哈~~~
IPointerDownHandler
IPointerUpHandler
IPointerClick //六个鼠标事件接口
IPointerEnter
IPointerExit
58.拖拽相关事件的接口实现
IBeginDragHandler //开始拖拽
IDragHandller //拖拽中
IEndDragHandler //外部拖拽
59.如何通过WWW下载图片
public string url = "图片的url";
IEnumerator Start() {
WWW www = new WWW(url); //实例化一个对象,传递一个参数
yield return www;
Renderer renderer = GetComponent();
renderer.material.mainTexture = www.texture;
}
会通过图片的url将图片下载贴在游戏物体上
60.Touches触摸事件
完全不知道讲了什么.....就是说了一个EasyTouch插件
61.关于Camera组件的作用和一些属性介绍
Don't Clear //如果选择这个会出现拖影效果
62.使用Camera把屏幕坐标转换成射线
Camera.main.ScreenPointToRay(Input.mousePosition); //从鼠标的屏幕点发射一条射线
屏幕坐标转换为世界坐标(待添加~~~)
63.CharacterController(角色控制器)的使用
移动方法: Move 和 SimpleMove
检测碰撞信息 : OnControllerColliderHit
CharacterController.SimpleMove //有物理的模拟,如果此物体在空中,那么他会先掉落在地面上再移动
CharacterController.Move //无物体模拟,直接向当前按键方向移动
void OnControllerColliderHit //检测碰撞到的物体的一个方法
64.Mesh的设置 public Mesh newMesh; GetComponent().mesh = newMesh //物体的形体会发生改变
60.Material材质类 private Material mat; mat = gameObject.GetComponent().material; //获取到游戏物体的材质
mat.color = Color.Lerp(mat.color,Color.red,Time.deltaTime); //当前颜色渐变到红色
61.Animation简介
Mecanim动画系统
Aniamtor.SetBool
Aniamtor.SetTrigger
Animator.SetFloat
62.Unity API方法变更1
使用this直接访问组件的形式被弃用了
新的访问方法是先定义一个字段,然后在Start方法中使用GetComponent<>()进行访问
63.Unity API方法变更-粒子系统
Unity 5.3: ParticleSystem main = smokePuff.GetComponent();
main.startColor
Unity 5.5+: ParticleSystem.MainModule� main = smokePuff.GetComponent().main;
main.startColor
主要变化是访问粒子系统的方法变为ParticleSystem.MainModule
64.Unity API方法变更-场景切换先关API变更
SceneManagement 代替 Application
使用前必须引入相关的命名空间using UnityEngine.SceneManagerment命名空间
private void OnLevelWasLoaded(int level) //当场景被加载时调用这个方法,现在被启用了
新的代替的方法是void SceneLoaded(Scene,Mode)
2d/3d声音的切换位于Audio Source组件中
网友评论