Unity基础大纲
2024-09-12 20:23:34 0 举报
AI智能生成
Unity是一款功能强大的游戏引擎,广泛应用于开发2D和3D游戏。本大纲将涵盖Unity的基础知识,包括场景搭建、游戏对象、组件系统、物理系统、光照系统、动画系统等核心内容。通过讲解这些关键概念,学员将能够掌握Unity的基本操作,了解如何创建和编辑场景,如何使用游戏对象和组件构建游戏逻辑,以及如何利用物理系统、光照系统、动画系统来丰富游戏体验。此外,大纲还将涉及一些进阶话题,如性能优化、渲染技术、UI设计等,帮助学员进一步提升Unity开发技能。
作者其他创作
大纲/内容
Vector(向量,坐标,旋转,缩放)
Vector3
Vector3.Angle()
两向量之间的夹角
Vector3.Distance()
两向量之间的距离
Vector3.Dot()
两向量之间点乘
Vector3.Cross()
两向量之间叉乘
vector3.Lerp()
两向量之间的插值
vector3.normalized
规范化向量
Vector3.magnitude
向量的模
Time
游戏开始到现在所花的时间
Time.time
时间缩放值
Time.timeScale
固定时间间隔
Time.fixedDeltaTime
上一帧到这一帧所用的时间
Time.deltaTime
计时器
float timer =0
Update{timer=time+Time.deltaTime}
Update{timer=time+Time.deltaTime}
UI
在代码中调用UI组件必须调用UI命名空间
UnityEngine.UI
UI组件在画布的基础上运行
Canvas
渲染模式
覆盖
将Canvas上的内容覆盖到摄像机渲染物体之上/UI永远在最上层显示
摄像机
由摄像机渲染UI与其他物体存在层级关系且Canvas永远面向摄像机
世界空间
Canvas可旋转即Canvas成为游戏物体
排序次序
画布渲染的优先级
UI缩放模式
屏幕大小缩放
无视游戏窗口分辨率自定义Canvas分辨率
图像
光线投射目标
是否接受射线
图像类型
简单
已切片
已平铺
已填充
Rect Transform
锚点
锚点固定在父物体上
图像的位置就是相对于锚点的偏移量
轴心点
图像的旋转缩放全部依靠轴心点控制
按钮(Button)
图片导入后纹理类型选择为Sprite(2D和UI)才能在UI中使用
导航
脱离鼠标选择
可使用手柄或键盘选择
事件
为物体创建脚本后将点击脚本所在的物体拖入并选择事件
文本输入框
旧版
创建文本输入框
Placeholder
站位文本
内容类型
限制输入的文本类型
事件调用(与Button用法一样)
新版
名称空间与旧版不同
TMPro
滑动条
Application(文件夹路径)
游戏数据文件夹路径(只读,加密压缩)
Application.dataPath
持久化文件夹路径
Application.persistentDataPath
StreamingAssets文件夹路径(只读,配置文件)
Application.streamingAssetesPath
临时文件夹
Application.temporaryCachePath
控制是否在后台运行
Application.runlnBackground
打开url
Application.OpenURL("https://*******")
退出游戏
Application.Quit()
结构体
旋转
四元数
Quaternion
Quaternion quaternion = Quaternion.identity(无旋转)
quaternion = Quaternion.Euler(rotate)
欧拉角转四元数
quaternion =Quaternion.LookRotation(new Vector3(*,*,*))
看向一个物体
欧拉角
Euler
Vector rotate= new Vector3(*,*,*)
rotate= quaternion.eulerAngles
四元数转欧拉角
生命周期
场景跳转
1.Build Setting添加场景
2.脚本代码编写
场景类
场景相关信息
获取当前场景
Scene scene =SceneManager.GetActiveScene()
场景名称
Debug.Log(scene.name)
场景是否已经被加载
Debug.Log(scene.isLoaded)
场景路径
Debug.Log(scene.path)
场景索引
Debug.Log(scene.buildIndex)
场景物体遍历
GameObject[] gos=scene.GetRootGameObject()
Debug.Log(gos.Length)
Debug.Log(gos.Length)
场景管理类(需导入SceneManagement命名空间)
场景跳转
SceneManager.LoadScene("索引/场景名称")
当前已加载场景数量
Debug.Log(SceneManager.sceneCount)
创建新场景
Scene newScene=SceneManager.CreateScene("newScene')
卸载场景
SceneManager.UnloadSceneAsync(newScene)
加载场景
替换
SceneManager.LoadScene("索引/场景名称",LoadSceneMode.Single)
叠加
SceneManager.LoadScene("索引/场景名称",LoadSceneMode.Additive)
协程方法用来异步加载场景(返回值固定IEnumerator)
IEnumerator LoadScene()
{operation/*提前声明AsyncOperation operation*,接收返回值/=SceneManager.LoadSceneAsync(1)
yeild return operation;
}
{operation/*提前声明AsyncOperation operation*,接收返回值/=SceneManager.LoadSceneAsync(1)
yeild return operation;
}
脚本开始时的协程方法调用
StartCoroutine(LoadScene())
输出加载进度 0-0.9
Debug.Log(operation.progress)
场景加载完成后跳转与否
operation.allowSceneActivation=false/true
异步/同步
同步
异步
协程
游戏物体(GameObject)
组件的获取
GameObject go=this.gameObject(可省略,即拿即用)
gameObject.name
gameObject.tag
gameObject.layer
.....
获取Transform组件
Transform trans=this.transform(可省略,即拿即用)
位置
世界位置
transform.position
相对位置
transform.localPosition
旋转
四元数旋转
相对本地旋转
transform.localRotation
相对世界旋转
transform.rotation
欧拉角旋转
相对世界旋转
transform.eulerAngles
相对本地旋转
transform.localEulerAngles
缩放
相对于父物体的缩放
transform.localScale
向量
物体前方
transform.forward
物体右方
transform.right
物体上方
transform.up
激活状态
激活状态的获取
当前真正的激活状态
Debug.Log(Cube.activeInHierarchy)
当前自身的激活状态
Debug.Log(Cube.activeSelf)
激活状态的设置
Cube.SetActive(true/false)
transform方法
时时刻刻看向某点
transform.LookAt(*,*,*)
旋转
围绕某个点旋转
transform.RotateAround(Vector3.zero/*所绕点的vector坐标*/,Vector3.up/*所要绕着旋转的轴*/,5/*所要旋转的度数*/)
自身旋转
transform.Rotate(Vector3.up/*所要绕着旋转的轴*/,1/*所要旋转的度数*/)
移动
transform.Translate(Vector3.forward*0.1f)
获取其他组件
BoxCollider bc=GetComponent<BoxCollider>()
获取组件的类型+命名=GetComponent<获取组件的类型>()
添加组件
脚本所在物体的自身添加
gameObject.AddComponent<添加组件的类型>()
非自身物体的添加
目标物体的类型.AddComponent<添加组件的类型>()
物体的父子级(依靠Tranform组件维持父子关系)
获取当前物体子物体身上的组件
GetComponentInChildren<获取组件的类型>()
获取当前物体父物体身上的组件
GetComponentInParent<获取组件的类型>()
获取父物体
transform.parent.gameObject
获取子物体的个数
transform.childCount
解除与子物体的父子关系
transform.DetachChildren()
获取子物体
Transform trans =transform.Find("子物体名称")
trans=transform.GetChild(索引)
判断一个物体是不是另一个物体的子物体
bool res=trans.IsChildOf(transform)
游戏物体的获取
拖拽
public GameObject cube
通过游戏物体的名称获取游戏物体
GameObject test=GameObject.Find("物体名称")
通过游戏标签来获取游戏物体
test=GameObject.FindWithTag("Tag名称")
预设体的实例化
1.获取预设体
public GameObiect Prefab
2.实例化预设体
GameObject go=Instantiate(Prefab,位置,旋转)
3.销毁预设体(游戏物体)
Destroy(go)
音频
音频接收
置于摄像机
必须存在Audio Listener组件才可以接收音频且多个摄像机仅存在一个Audio Listener组件即可
音频播放
添加Audio Source组件
AudioClip音频剪辑
唤醒时播放
循环
3D Sound Settings
通过脚本设置Audio Source
获取Audio Clip
public AudioClip music;
public AudioClip se;
public AudioClip se;
获取播放器组件
声明
private AudioSource player;
获取
player=GetComponent<AudioSource>();
设定播放的音频片段
player.clip=music;
设置播放循环
player.loop=true;
设置播放音量
player.volume=0.5f;
播放音频
player.Play();
按键控制声音的播放和暂停
if(Input.GetKeyDown(KeyCode.按键))
{
if(player.isPlaying)
{
player.Pause();/player.Stop();/*Stop()会将音频进度重置*/
}else
{
player.UnPause();/player.Play();
}
}
{
if(player.isPlaying)
{
player.Pause();/player.Stop();/*Stop()会将音频进度重置*/
}else
{
player.UnPause();/player.Play();
}
}
按鼠标左键播放声音
if(Input.GetMouseButtonDown(0))
{
player.PlayOneShot(se);/*只播放一遍*/
}
{
player.PlayOneShot(se);/*只播放一遍*/
}
红外线与射线检测
射线的创建
Ray ray=new Ray(Vector3.zero,Vector3.up/*一个点一个向量*/)
ray=Camera.main.ScreenPointToRay(Input.mousePosition)
声明碰撞信息类
RaycastHit hit;
RaycastHit,它是用于存储射线碰撞到的第一个物体的信息,所以需要提前创建这个对象,用于信息的碰撞信息的存储;
碰撞检测
单检测
bool res=Physics.Raycast(ray,out hit)
若碰撞到物体的情况下,hit就有内容了
多检测
RaycastHit[] hits=Physics.RaycastAll(ray,距离,层级)
碰撞与触发
碰撞
只有在物体有碰撞器的情况下才能产生碰撞
想要物体产生碰撞要确保至少有一个物体带有缸体组件
脚本控制碰撞
监听发生碰撞
private void OnCollisionEnter(Collision collision/*碰撞信息,若想拿到碰撞物体则需collsion.collider*/){}
持续碰撞中
private void OnCollisionStay(Collision collision){}
结束碰撞
private void OnCollisionExit(Collision collision){}
触发
只有在物体有碰撞器的情况下才能实现触发
想要物体实现触发要确保至少有一个物体带有缸体组件
将一个物体的碰撞器设置为是触发器
脚本控制触发
开始触发
private void OnTriggerEnter(Collider other/*进入触发的碰撞器*/){}
持续触发
private void OnTriggerStay(Collider other){}
触发结束
private void OnTriggerExit(Collider other){}
动画组件
旧版(Animation)
属性
PlayAutomatically
是否自动播放默认动画
AnimatePhysics
驱动方式
CullingType
总是动画化
BasedOnRenderers
镜头内运行
动画制作
创建动画(Ctrl+6)
选中动画物体并创建动画
数值修改
添加属性并修改不同帧的属性数值
运动录制
点击录制按钮并运动物体记录
通过代码播放动画
GetComponent<Animation>().Play(“Clip名称”);
新版(Animator)
属性
动画器控制器
动画状态
每个动画状态都包含动画文件及动画文件相关设置
入口状态
结束状态
任意状态
图层中所有状态都可以过渡到AnyState所连接的状态
子状态级
新建图层的属性
权重
动画的播放优先级
遮罩
可选择动画执行部位
设置条件控制动画状态的过渡
添加参数
添加过渡条件
取消退出时间的勾选可消除指令延迟
代码控制参数
声明animator并获取Animator组件
GetComponent<Animator>().SetTrigger("动画名称")
混合动画
导航/自动寻路
环境烘焙
设置环境为静态导航(Nagivation Static)
烘焙
代理半径
所导航物体的运算半径
代理高度
所导航物体的运算高度
最大坡度
所能行走的最大坡度
步高
所能抬起的最高跨度
玩家设置
添加导航代理组件(Nav Mesh Agent)
代理类型
针对不同体型玩家设置不同属性
优先级
导航优先级
区域遮罩
选择可导航的区域
通过脚本控制组件控制移动
导入命名空间
UnityEngine.AI
引用
private NavMeshAgent agent;
获取代理组件
agent=GetComponent<NavMeshAgent>();
获取点击位置
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosistion);
RaycastHit hit;
if(Physics.Raycast(ray,out hit))
{
Vector3 point=hit.point;
//设置该位置为导航位置
agent.SetDestination(point);
}
RaycastHit hit;
if(Physics.Raycast(ray,out hit))
{
Vector3 point=hit.point;
//设置该位置为导航位置
agent.SetDestination(point);
}
区域分类
设置导航区域
烘焙
自动计算行走成本
线段与拖尾
线段渲染器(LineRenderer)
通过代码设定线段位置
获取LineRenderer组件
LineRnederer lineRenderer=GetComponent<LineRenderer>()
给予点的数量和位置
lineRenderer.positionCount=3;
lineRenderer.SetPosition(0,Vector3.zero)
lineRenderer.SetPosition(0,Vector3.one)
lineRenderer.SetPosition(0,Vector3.down)
lineRenderer.SetPosition(0,Vector3.one)
lineRenderer.SetPosition(0,Vector3.down)
属性
踪迹渲染器/拖尾(TrailRenderer)
粒子特效
物理关节
铰链关节(Hinge Joint)
弹簧关节(Spring Joint)
固定关节(Fixed Joint)
反向动力学(Inverse kinematics/IK)
获取指向物体位置
public Transform target;
勾选IK处理
IK事件方法
private void OnAnimatorIK(int layerIndex/*层的索引*/){}
设置头部IK
设置头部IK权重
animator.SetLookAtWeight(1);
设置位置
animator.SetLookAtPosition(target.position);
设置右手IK
设置右手IK权重
animator.SetIKPositionWeight(AvatarIKGoal.RightHand,1);
旋转权重
animator.SetIKRotationWeight(AvatarIKGoal.RightHand,1);
设置右手IK
animator.SetIKPosition(AvatarIKGoal.RightHand,target.position);
animator.SetIKRotation(AvatarIKGoal.RightHand,target.rotation);
碰撞器(Collider)
物理材质
重力系统(Rigidbody/缸体组件)
质量
阻力
角阻力
旋转阻力
使用重力
是否受重力影响
Is Kinematic
是否受物理影响
插值
碰撞检测
离散的
节省性能但非连续检测(子弹效应)
持续
持续监测但消耗性能
连续动态
可用于高速移动物体
Constraints
冻结属性
info
不可被修改
角色控制
资源商店直接购买下载导入
脚本控制
为游戏物体添加CharacterController组件
1.声明
private CharacterController player;
2.获取CharacterController组件
player=GetComponent<CharacterController>();
5.朝向该方向移动
以秒为单位
player.SimpleMove(der*2);
以帧为单位
transform.Translate(dir*2)
转化为秒为单位
transform.Translate(dir*2*Time.deltaTime)
角色移动
声明animator并获取Animator组件
animator=GetComponent<Animator>()
获取虚拟轴向
float horizontal=Input.GetAxis("Horizontal")
float vertical=Input.GetAxis("Vertical")
float vertical=Input.GetAxis("Vertical")
创建成为方向向量
Veceor3 dir=new Vector3(horizontal,0,vertical);
跑步动作的实现
当用户按下方向键
if(dir!=Vector3.zero){}
面向向量
transform.rotation=Quaternion.LookRotation(dir);
播放跑步动画
animator.SetBool(“IsRun”,true);
朝向前方移动
transform.Translate(Vector3.forward*2*Time.deltaTime);
步行跑步切换
else{animator.SetBool("IsRun",false)}
视频
组件控制视频播放
导入MP4文件
创建渲染器纹理
创建游戏物体
添加Video Player组件
将MP4拖入VideoClip
选择渲染模式-渲染器管理
将渲染器纹理拖到游戏物体上
创建原始图像
将渲染器纹理拖到原始图像纹理上
脚本控制视频播放
引用名称空间UnityEngine.Viedo;
声明private VideoPlayer player;
获取组件player=GetComponent<VideoPlayer>();
后续与音频同理
摄像机
透视摄像机
正交摄像机
清除标志·
天空盒
可自行下载天空盒资源
纯色
拍摄不到的为纯色
不清除
拍摄不到就不显示
仅深度
仅显示所拍到的物体,其余部分由其他相机提供
深度
深度高的摄像机优先显示
剔除遮罩
取消显示未勾选的图层
FOV轴
设定视野范围
剪裁平面
设定视野范围
ViewPort矩形
控制摄像机所摄取的画面在游戏窗口中的显示占比
xy影响位置
wh影响宽高
目标显示
与游戏窗口对应一致
目标纹理
新建渲染器纹理
将渲染器纹理拖到摄像机目标纹理
设置目标纹理后将取代目标显示并可拖放给任意游戏物体将摄像机所拍摄画面附着给游戏物体
对齐视图
Ctrl+shift+f
灯光
阴影类型
软阴影高功耗高质量
硬阴影低功耗低质量
剪影
投射剪影光线
光源类型
定向光
只有旋转能影响光照方向
模式
实时
实时通过计算生成的光(高功耗)
烘焙
设置灯光数据保存后可删除灯光并不影响光照
选择烘焙物体
窗口-渲染-光照
生成照明
混合
聚光
类手电筒
点光源
类灯泡
区域(仅烘焙)
触摸方法
开启多点触摸
Input.multiTouchEnabled=true
判断单点触摸
if(Input.touchCount==1){}
触摸对象
Touch touch=Input.touches[0]
触摸位置
touch.position
触摸阶段
判断多点触摸
if(Input.touchCount==2){}
触摸对象
Touch touch=Input.touches[0]
Touch touch1=Input.touches[1]
Touch touch1=Input.touches[1]
虚拟轴与虚拟按键
位置与原理
获取轴
获取水平轴
float horizontal=Input.GetAxis(“Horizontal”)
获取垂直轴
float vertical=Input.get=Input.GetAxis("Vertical")
虚拟按键
if(Input.GetButtonDown("Jump"))
if(Input.GetButton("Jump"))
if(Input.GetButtonUp("Jump"))
键鼠事件(在Update中编写)
鼠标
按下鼠标(0左键1右键2滚轮)
if(Input.GetMouseButtonDown(0)){}
持续按下鼠标
if(Input.GetMouseButton(0)){}
抬起鼠标
if(Input.GetMouseButtonUp(0)){}
按键
按下键盘按键
if(Input.GetKeyDown(KeyCode.A/“a”)){}
持续按下按键
if(Input.GetKey(KeyCode.A/“a”)){}
抬起键盘按键
if(Input.GetKeyUp(KeyCode.A/“a”)){}
调试
Debug
文字调试
Log(“”)
普通输出
LogWarning(“”)
警示输出
LogError(“”)
错误输出
图像调试
DrawLine()
绘制一条线,起点,终点
DrawRay()
绘制一条射线,起点,射线
0 条评论
下一页