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