unity入门
游戏场景
一个游戏可以有多个场景,不同的关卡可能都是不同的场景。
创建项目的时候会默认创建一个SampleScene场景文件。
新建场景快捷键:Ctrl+N
组件
简易模型和材质
添加模型步骤:在层级面板中=》右键=》3DObject=》各种模型
材质
在Assets文件夹下创建material文件夹用于存放材质
右键=》Create=》Material用于创建材质
Sence界面游戏物体的操作
工具栏
手型工具:快捷键Q,用于拖动场景,等同于鼠标中键
移动工具:快捷键W,用于移动物体 **注意:**父物体移动,子物体会跟随移动,旋转、缩放同理
旋转工具:快捷键E,用于旋转物体
缩放工具:快捷键R,用于缩放物体
约束与吸附
变化约束:移动、缩放、旋转时按住Ctrl可以约束移动距离、缩放程度、旋转程度,
具体约束程度可以在Edit=》Grid And Snap中设置
吸附:按住V选择模型表面的一个点,拖拽到另一个模型表面进行吸附
快速复制:Ctrl+D
快速定位:F,等同于双击
自定义组件
创建组件
unity的设计思想是基于组件的,所以我们的代码本质上也是一个组件,比如我们写一个功能让角色可以移动,那么这个C#文件就是一个组件,可以挂载到物体上,挂载了就可以移动。
创建组件步骤:项目面板中右键=》Create=》script,将脚本拖拽到游戏物体上即可
组件的特点:
1、继承了MonoBehaviour的类都是组件
2、unity中创建脚本默认就是继承了MonoBehaviour
3、只有组件可以挂载到游戏物体上
Transform组件
Transform组件的三个主要数值
Position位置
Rotation旋转
Scale缩放
实现物体的移动:
private float num=0;
void Update(){
transform.position=new Vector3(num,10,10);
num+=0.01f
}
transform常用属性和方法:
属性
childCount:子物体数量
parent:父物体Transform组件
root:最高级别父物体
position、eulerAngles、localScale
方法
Find(string):查找子物体
Translate(new Vector3(0.01f,0,0)):向指定方向移动
Rotate(Vector3):旋转指定角度
LookAt(transform):看向一个物体
GameObject
GameObject就是游戏对象或者说游戏物体,层级面板中可以选择的的都是GameObject。
同时,GameObject在代码中也是一个类型,这个类型就代表着游戏物体。
在C#中可以通过公开字段,在Inspector面板中设置该字段的值。(public GameObject go;)
gameObject
组件中可以使用来自基类继承的gameObject属性,直接访问脚本所在的游戏物体
gameObject:组件所在的游戏物体
transform:组件所在的游戏物体的transform组件
gameObject常用属性和方法:
属性
name:游戏物体名称
tag:游戏物体标签(在Inspector面板中可以设置物体的标签)
activeInHierarchy:显示状态
transform:这个游戏物体的变换组件
方法
GameObject.Find(“cubeFather/cubeSon”) 一个静态方法,用于查找游戏物体(示例中查找到了cubeSon)
**注意:**子物体的坐标是相对于父物体的偏移量
GetComponent():获取游戏物体身上的组件,T代表要查找的类型(GetComponent())
SetActive(bool):设置显示状态
预制体
概念
预先制作好的游戏物体(Prefabs)
创建预制体
直接将游戏物体拖到项目面板中,unity会自动为我们生成一个预制体
预制体可以套娃,也就是预制体套预制体
变体
创建预制体的过程中,如果游戏物体已经是预制体,unity会弹窗提示我们创建模式
1、原始预制体(Original Prefabs):一个独立的预制体
2、预制体变体(Prefabs Variant):旧的预制体变化,变体也发生变化,但变体保留和预制体不同的部分
unity生命周期函数
Awake():唤醒事件,一开始就执行,只执行一次
OnEnable():每次启用都会执行一次
Start():开始事件,只执行一次,与Awake的区别只有顺序不一样
Update():更新事件,每一帧执行一次
FixedUpdate():固定更新事件,0.02秒执行一次,所有物理相关的信息都在这个事件中处理
LateUpdate():稍后更新事件,跟随Update()执行
OnDisable():禁用事件,每次禁用都会执行,在OnDestroy()之前也会执行,与OnEnable()相对
OnDestroy():销毁事件,执行一次
Invoke函数
Invoke是调用和执行的意思
1、Invoke(string methodName, float time); //输入一个方法的名称,过个几秒执行一次,只执行一次。
methodName:方法名称
time:几秒后执行
2、InvokeRepeating(string methodName, float time, float repeatRate); //重复调用
methodName:方法名称
time:几秒后执行
repeatRate:重复间隔时间
3、CancelInvoke(string methodName); //取消调用,使用无参重载就是取消全部
协程
主程序已经在执行某个任务,希望“同时运行”其他逻辑,这里的同时,并不是多线程意义上的同时,只是感官上的同时。
public IEnumerator Demo(){ //IEnumerator协程特定返回值
Debug.Log("做一些事情");
yield return new WaitForSeconds(1.0f); //等待一秒钟
Debug.Log("做一些事情"); //虽然前面已经返回,但协程依旧会继续执行下面的代码
yield return null; //等待一帧再继续执行
Debug.Log("做一些事情");
}
使用协程
Coroutine coroutine = StartCoroutine(Demo());
协程可以用来做动画
public IEnumerator Demo2(){
while(true){
yield return new WaitForSeconds(1.0f);
transform.Rotate(new Vector3(5,0,0));
}
}
协程可以在结束之后进入另一个协程
public IEnumerator Demo3(){
transform.position=new Vector(10,10,10);
yield return Demo2;
}
手动结束协程
StopAllCoroutines(); //结束全部协程
StopCoroutine(); //结束某个协程
StopCoroutine(IEnumerator routine); //和调用协程一样使用,但是如果协程有参数不要使用这个
StopCoroutine(Coroutine routine); //参数填写协程变量
StopCoroutine(String methodName); //参数填写协程的方法名
常用工具类
数学工具类
1、Mathf.Abs(int num); 返回绝对值
2、Mathf.Max(int a,int b); 返回最大值
3、Mathf.Min(int a,int b); 返回最小值
4、Mathf.Round(2.5f); 返回四舍六入,五取偶
5、Mathf.Ceil(2.5f); 返回向上取整的值
6、Mathf.Floor(2.5f); 返回向下取整的值
7、Random.Range(0,5); 返回随机值
(1)若是int重载,返回[0,4]随机值
(2)若是float重载,返回[0,5]随机值
时间工具类
只读
Time.time:表示从游戏运行开始到现在的时间,会随着游戏的暂停而停止计算
Time.deltaTime:表示从上一帧到当前帧的时间,以秒为单位
Time.realTimeSinceStartUp:表示自从游戏开始后的总时间,即使暂停也会增加,即现实时间
读写
Time.timeScale:时间缩放,默认值为1,若设置<1,表示时间减缓,若设置>1,表示时间加快,0意味着游戏暂停。
unity2D
2D游戏的相机
2D游戏中,Main Camera的Projection设置为Orthographic即可,也就是正交模式(忽视近大远小)
Sprite和SpriteSheet
Sprite是一种游戏资源,在2D游戏中表示角色、场景的图片资源
导入图片后,将Texture Type改为Sprite(2D and UI),然后右下角apply
点击视图上方的2D可转换2D开发视角
SpriteSheet表示切割一个图片为多个Sprite,也就是SpriteSheet
首先安装官方拓展包:
Window=》Package Manage=》2D Sprite=》Install
切割
Sprite Mode改为Multiple
点击Sprite Editor
Slice=》Type改为Automatic=》Slice 会根据每张图片的边缘进行切割
SpriteRender组件
Sprite:显示当前的Sprite,可修改为其他Sprite
Color:给Sprite叠加颜色
Flip:翻转
SortingLayer:排序层,相当于z-index
OrderinLayer:排序值,同层比较
代码操作
private SpriteRender spriteRender;
spriteRender=GetComponent<SpriteRender>();
spriteRender.sprite=sprite;
物理系统
刚体
Add Component=》Rigidbody 2D
加上刚体组件后就有物理效果了
一个游戏物体如果希望具备重力,那么它一定需要RigidBody
BodyType:
Dynamic:动态,最仿真的
Kinematic:运动,由代码控制
Static:静态,不是为了移动而设计的
Simulated:是否模拟,不模拟的话,不会有重力、碰撞等
Mass:质量
Linear Drag:位置移动的阻力系数
Gravity Scale:重力程度
Collision Detection“:定义如何检测2D碰撞体之间的碰撞
Constraints:定义对2D刚体运动的任何限制
Material物理材质
物理材质有两个属性可以设置
Friction摩擦力
Bounciness弹性
创建物理材质:Create=》Physics Material 2D
代码操作:
private Rigidbody2D rigidbody2D;
rigidbody2D=GetComponent<Rigidbody2D>();
rigidbody2D.mass=3;
碰撞体
添加碰撞体组件
Add Component=》Box Collider 2D
点击Edit Collider,可以在Scene面板中编辑碰撞体的尺寸
Offset:偏移量
Size:碰撞体尺寸
Material:物理材质
碰撞事件
很多时候,我们需要知道两个游戏物体发生碰撞,比如子弹碰到玩家角色,玩家需要扣除相应的HP
三个函数:
//碰撞进入
private void OnCollisionEnter2D(Collision2D collision){
}
//碰撞退出
private void OnCollisionExit2D(Collision2D collision){
}
//碰撞过程中
private void onCollisionStay2D(Collision2D collision){
}
//Collision2D是碰撞信息,collision.gameObject对方的游戏物体
重要知识
1、双方都没有刚体和碰撞体,绝不可能发生碰撞
2、双方都有碰撞体和刚体,会发生碰撞
3、一方有刚体和碰撞体,另一方只有刚体,可以触发碰撞事件
4、双方都没有刚体,无法进入碰撞事件
触发
顾名思义,触发器
设置触发
只要在碰撞体上勾选IsTrigger即可
**注意:**设置触发后这个物体不具备”物理边缘“,任何游戏物体都可以穿过它
三个触发函数
//触发进入
private void OnTriggerEnter2D(Collision2D collision){
}
//触发退出
private void OnTriggerExit2D(Collision2D collision){
}
//触发过程中
private void onTriggerStay2D(Collision2D collision){
}
//Collision2D为对方碰撞体
游戏输入
键盘输入
void Update(){
//按下,只有第一次按下的那一帧有效
if(Input.GetKeyDown(KeyCode.A)){
print("按了个A");
}
//弹起,只有第一次按下的那一帧有效
if(Input.GetKeyUp(KeyCode.A)){
print("弹起了个A");
}
//按住,持续有效
if(Input.GetKey(KeyCode.A)){
print("按下了A");
}
}
蓄力攻击
public string attachKeyName;
private float attachValue=0;
void Update(){
if(Input.GetKeyDown(attachKeyName)){
print("开始蓄力");
attachValue=0;
}
if(Input.GetKey(attachKeyName)){
print("蓄力中");
attachValue+=Time.deltaTime
}
if(Input.GetKeyUp(attachKeyName)){
print("发动攻击,攻击力:"+attachValue);
}
}
鼠标输入
鼠标按下
Input.GetMouseButtonDown(0); **注意:**0:左键;1:右键
鼠标抬起
Input.GetMounseButtonUp(0);
鼠标持续按下
Input.GetMouseButton(0);
鼠标当前坐标
Input.mousePosition
输入管理器InputManage
unity为我们提供了一个输入管理器,鼠标、键盘检测都与此有关
Edit=》ProjectSettings=》InputManager
获取轴:
横向轴
A、D、←、→
Horizontal
Input.GetAxis(“Horizontal”); [-1,1]有平滑的过度
Input.GetAxisRaw(“Horizontal”); 只有-1、0、1
纵向轴
W、S、↑、↓
Vertical
用法与横轴类似
小球移动和跳跃的案例
public class Player : MonoBehaviour
{
public float speed=10;
private new Rigidbody2D rigidbody2D;
public float power=300;
//是否在地面上
public bool isOnGround;
// Start is called before the first frame update
void Start()
{
rigidbody2D = GetComponent<Rigidbody2D>();
}
// Update is called once per frame
void Update()
{
move();
jump();
}
void move(){
//获取玩家的输入状况
float horizontal=Input.GetAxis("Horizontal");
//float vertical=Input.GetAxis("Vertical");
//根据输入得到一个移动方向
Vector3 dir = new Vector3(horizontal,0,0);
//位移
transform.Translate(dir*Time.deltaTime*speed);
//帧率越高,需要的移动速度越低
}
void jump()
{
//若玩家按下空格,则施加一个向上的力
if (Input.GetKeyDown(KeyCode.Space) && isOnGround)
{
rigidbody2D.AddForce(Vector2.up*power);
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
//判断是否接触地面
if (collision.gameObject.name == "Square")
{
isOnGround = true;
}
}
private void OnCollisionExit2D(Collision2D collision)
{
if (collision.gameObject.name == "Square")
{
isOnGround = false;
}
}
}
UI
UI系统的组成
Canvas:画布,UI的根节点
EventSystem:事件系统,基于这个才能让我们的按钮可以点击
各种组件:具体的功能组件,显示一个图片、制作一个按钮等
Image组件
Image游戏物体必须放在Canvas游戏物体下才能生效
主要属性
SourceImage:源图片,在脚本中叫sprite,要将Texture Type改为Sprite(2D and UI),然后右下角apply,之后才能赋值
Color:图片颜色
RaycastTarget:是否可以作为射线目标、后续点击、拖拽等事件需要使用
ImageType:显示模式
Sample:普通模式
Sliced:切片,需要图片九宫格,要在资源层面处理
Tiled:平铺
Filled:填充
Fill Amount:填充百分比
主要功能
Set Native Size:设置为图片的原始尺寸
**注意:**如果要通过脚本操作UI,必须引入UI的命名空间,using UnityEgine.UI
Text组件
基本属性同上,略
对齐属性
Alignment:文本的对齐方式
Horizontal Overflow:水平溢出
(1)Wrap:文本将自动换行
(2)Overflow:可以超出边界,继续显示
Vertical Overflow:垂直溢出
(1)Truncate:文本不显示超出垂直边界的部分
(2)Overflow:文本可以超出垂直边界,继续显示
Best Fit:自动适配
(1)Min Size:字体最小值
(2)Max Size:字体最大值
Button组件
基本属性
Interactive:是否可交互
Transition:过渡方式,按钮状态一般分为三种、鼠标悬浮、点击、不可交互
Target Graphic:按钮影响的Image
Normal Color:常规颜色
Highlighted Color:高亮、鼠标悬浮颜色
Pressed Color:按下颜色
Disabled Color:禁用颜色
Fade Duration:颜色过渡时间
Button事件
private Button button;
private void start(){
button=GetComponent<Button>();
button.onClick.AddListener(ButtonClick);
}
public void ButtonClick(){
}
InputField组件
输入类型
ContentType中可以限制输入的类型,如邮箱、密码等
InputField事件
与Button事件类似
onValueChanged 内容变化
onEndEdit 光标失焦
**注意:**监听的函数可传参数,参数为InputField中的内容
Toggle组件
就是HTML中的单选框
Toggle事件
onValueChanged
单选框二选一
两个Toggle组件有同一个父物体,父物体上添加Toggle Group,将父物体拖进两个Toggle中的Group属性中,即可实现。
Slider组件
Slider事件
SliderOnValueChanged
UI布局
Rect transform 主要设置
**注意:**在canvas下的UI元素的transform属性都是Rect transform
原点
只有UI有原点,就是中心的那个圆点
Pivot为原点坐标,默认(0.5,0.5)
锚点
透明保护伞X
用于维持子物体相对于父物体的距离和缩放
子物体的原点相对于父物体的锚点
Canvas
UI的根节点就是Canvas,意味着UI都要放在Canvas下才能正确显示
一个场景中可以有多个Canvas存在,并且可以同时生效
Canvas游戏物体由三个组件组成:
Canvas:画布
Canvas Scaler:画布比例
Graphic Raycaster:射线检测
Render Mode 渲染模式
Screen Space-Overlay模式:
Canvas将置于屏幕的最上层,自动填充屏幕,不会被其他模式的Canvas或2D、3D物体遮挡
Screen Space-Camera模式:
Canvas将置于相机前方,此时在Canvas和相机中间的2D、3D物体将显示在UI上面,利用这一点,可以实现在UI界面展示3D模型
Render Camera:对应渲染相机,也就是Canvas显示在哪个Camera前面
Plane Distance:Canvas与Camera的距离
World Space模式:
Canvas将作为一个游戏对象显示在3D场景内
Event Camera:接收UI事件的Camera
Canvas Scaler 适配屏幕的主要方式
UI Scale Mode缩放模式
Constant Pixel Size模式:
固定像素大小,不论屏幕分辨率尺寸大小如何变化,像素爆出原有大小不变
Scale Factor:缩放倍数
Scale With Screen Size模式:
屏幕自适应常用方式
Reference Resolution:参考分辨率,进行屏幕适配,自动缩放UI大小时,将以此作为参考
UI事件
脚本中添加
using UnityEngine.EventSystems
事件相关命名空间
脚本需要继承事件接口,并实现对应接口即可
IPointerClickHandler:鼠标点击
IPointerDownHandler:鼠标按下
IPointerUpHandler:鼠标弹起
IPointerEnterHandler:鼠标进入
IPointerExitHandler:鼠标退出
IBeginDragHandler:开始拖拽
IDragHandler:拖拽中
IEndDragHandler:停止拖拽
3D
3D刚体
constraints 约束
Freeze Position 冻结位移
Freeze Rotation 冻结角度
若两个都勾选,则物体失去物理特性
物理射线
用于判断射击是否命中,点击地面建造建筑物等功能
Ray:射线类
Physics.Raycast:计算射线碰撞
RaycastHit:射线检测信息类
Debug.DrawLine:绘制线条(玩家看不到,仅编辑器测试)
void Update(){
//射线,向上,从(0,0,0)到(0,1,0)
Ray ray=new Ray(Vector3.zero,new Vector3(0,1,0));
if(Physics.Raycast(ray,out RaycastHit hitinfo,1000)){//射线距离1000
Debug.Log(string.Format("射线碰到了{0},在{1}位置",hitinfo.collider.gameObject.name,hitinfo.point));
Debug.DrawLine(ray.origin,hitinfo.point);//起点到终点
}
}
由摄像机发出到鼠标的一条射线
Ray ray=Camera.main.ScreenPointToRay(Input.mousePosition);
刚体移动
Rigidbody.MovePosition(vector3.target);
private void Move(){
float h=Input.GetAxis("Horizontal");
float v=Input.GetAxis("Vertical");
Vector3 offset=new Vector3(h,0,v)*0.02f*3;
rigidbody.MovePosition(transform.position+offset);
}
摄像机
camera组件
基本属性
Field of View:视野大小,默认60
Clipping Planes:画面拍摄的最大、最小距离
摄像机快速定位:
当视角漫游到某一位置,想要摄像机到达同一视角
上方工具栏GameObject=》Align With View
快捷键:CTRL+shift+F
灯光
Directional 平行光旋转可达到昼夜交替的效果
Spot 聚光灯
Point 点光源
常用属性
Type:灯光类型
Range:灯光范围
Mode:渲染模式
Realtime:动态计算灯光
Baked:一开始就确定好灯光,后面场景改变不会影响灯光
Mixed:混合
Intensity:光照强度
Shadow Type:阴影类型
无阴影、硬阴影、软阴影
Strength:阴影强度
Bias:倾斜
Shader
渲染管线
渲染管线就是“渲染流水线”,Unity中主要有:
Build-In Render Pipeline(内置渲染管线):默认的渲染管线
Universal Render Pipeline(通用渲染管线):性能较好
HD Render Pipeline(高清渲染管线):以画面为主,偏向高端机器和影视的渲染管线
Shader是渲染管线的算法片段,用于告诉图形硬件如何计算和输出图像
Shader的制作一般基于某个渲染管线,一般不具备通用性
Shader可以让模型展现出不同的效果,比如风格化、水等
使用方法:
将Shader附加给材质球,然后把材质球附加给网格渲染器
粒子系统
游戏中下雨、下雪以及一些技能效果
创建一个粒子游戏物体
层级面板中右键=》Effects=》Particle System
此游戏物体上有一个Particle System组件
基本属性
Duration:持续时间
Looping:是否循环
Start Lifetime:粒子发射出去后存活时间
Play On Awake:是否立刻播放粒子
Stop Action:结束事件,选择Destory则播放完销毁自己
动画系统
1、在游戏物体上挂载Animator动画组件
2、Animator组件上持有动画控制器(Animator Controller),动画控制器上配置好动作以及动作的切换逻辑
Create=》Animator Controller
将创建好的控制器拖到游戏物体上Animator组件中的Controller属性中
3、创建新的动画片段
Create=》Animation
制作动画
打开Animatiion窗口:windows=》Animation=》Animation
Animator面板是动画控制器,Animation面板是某一个动画的具体动画片段
1、点击Animation窗口上方的红色圆点,开启录制
动画控制器
Animator Controller是一个配置文件
Loop Time:动画是否循环播放
Loop Pose:是否循环姿势,让头尾衔接更加平滑
动画切换
Has Exit Time:是否播放完毕再切换
Conditions:条件参数,什么时候起效果
动画切换代码控制
private Animator animator;
void Start(){
animator=GetComponent<Animator>();
}
void Update(){
if(Input.GetKeyDown(KeyCode.Space)){
animator.SetTrigger("跳一跳");
}
}
模型资源与动画设置
导航系统
1、导航初始化
若要设定导航,首先要确定一张地图,规定哪里能去,哪里不能去
1、打开导航面板
windows=》AI=》Navigation
2、回到Inspector面板,将地形、场景相关的物体设置为static模式
3、选择子栏目Bake
4、点击Bake按钮,开始烘焙
场景中部分区域呈蓝色,意味着这个区域角色可以进入
2、NavMashAgent导航组件
在player身上添加NavMashAgent组件
主要属性
Agent Type:代理类型,主要是设置这个角色的尺寸,默认即可
Bass Offset:碰撞体和角色高度偏移
Speed:导航时最大的移动速度
Angular Speed:导航时最大的旋转速度
Acceleration:导航刚开始时加速到Speed所需要的程度,越大越快
Stopping Distance:距离终点多远停止
Auto Braking:勾选表示角色到达目标点或与目标点的距离满足Stopping Distance时自动停止。若不勾选,角色即使到达目标点,也会围着目标点转圈圈
障碍规避属性Avoidance
Radius:碰撞体半径
Height:碰撞体高度
Quality:躲避障碍物的行为质量,质量越高越智能
Priority:优先级,0-99,0最高,99最低,高优先级的Agent不会与低的Agent进行碰撞
3、代码操控
首先引入命名空间
using UnityEngine.AI;
private NavMeshAgent agent;
public Transform target;
void Start(){
agent=GetComponent<NavMashAgent>();
}
void Update(){
agent.SetDestination(target.position) //设置导航,填写目标位置
if(Input.GetKeyDown(KeyCode.Space)){
agent.isStope=!agent.isStope;
}
}
导航面板详解
Areas区域设置
在不同游戏场景中,不同区域的行走代价是不同的,比如陆地肯定比沼泽走起来更快,所谓代价也就是移动成本不同,代价越高的地方,导航系统会尽可能绕过去。
Areas面板主要用来设置不同区域的不同成本
Object游戏物体设置
Scence Filter:场景过滤,主要影响层级面板中的显示
选择一个物体后,Object面板会发生一些变化,只有静态物体才可以进行Navigation Areas设置
Navigation Areas:设置所选游戏物体的区域设置。
NavMashObstacle(障碍物)组件
直接给游戏物体添加这个组件即可
参数
Shape:形状,类似碰撞体的蓝色外框,但实际上并不具备碰撞体的特性,可以穿模,仅仅用于导航计算上
Center:中心点
Size:尺寸
Carve:不勾选时,该障碍物只是阻挡了物体前进的路线,物体不会绕过该物体进行导航
资源管理
资源的导入与导出
在要导出的资源上右键=》Export package=》
预制体实例化
游戏中通常需要通过代码生成子弹、刷新小兵等,所以要将预制体实例化到场景中。
GameObject.Instantiate()
public GameObject Prefeb_Cube;
void Start(){
//实例化一个Prefeb_Cube
GameObject cube=GameObject.Instantiate(Prefeb_Cube,new Vector3(0,1,0),Quaternion.indentity,transform);
//第一个参数:要实例化的预制体,第二个参数:生成位置,第三个参数:不旋转,第四个参数:parent
}
Resources资源加载
创建Resources文件夹,将Prefeb/cube放入文件夹中
Prefeb_Cube=Resources.Load<GameObject>("Prefeb/cube");
数据存档PlayerPrefs
存储
PlayerPrefs.SetInt(“Key”,99);
PlayerPrefs.SetFloat(“Key”,1.11f);
PlayerPrefs.SetString(“Key”,“Hello”);
获取
int value=PlayerPrefs.GetInt(“Key”);
Float value=PlayerPrefs.GetFloat(“Key”);
String value=PlayerPrefs.GetString(“Key”);
删除全部
PlayerPrefs.DeleteAll();
删除指定数据
PlayerPrefs.DeleteKey(“Key”);
查找是否存在指定数据
bool exist=PlayerPrefsHasKey(“Key”);
场景加载
场景切换
场景切换的前提是:该场景必须被打包,File=》Build Setting,将场景拖进Scenes in Build,排序第一的场景将作为游戏的开场。
引入命名空间
using UnityEngine.SceneManagement
加载场景
SceneManager.LoadScene(),多个重载方式
int 场景编号
string 场景名称
数据保留
有时需要跨场景数据交互
GameObject.DontDestroyOnLoad(object) //加载场景不销毁
//object一般使用gameObject,即可将整个游戏物体及数据带入下一个场景
声音系统
Audio Source组件
属性
Audio Clip:指定播放音频的文件
Mute:是否静音
Play On Awake:在组件加载后立即播放
Loop:是否循环
Volume:音量
Pitch:音调
Stereo Pan:声道占比
Reverb Zone Mix:回音混合
3D Sound Setting:3D声音设置
常用方法
Play() 播放
Stop() 停止播放
Pause() 暂停播放
PlayOnShot(AudioClip) 播放某个片段一次,可以叠加
打包发布
1、设置发布场景
File=》Build Setting=》Scence In Build,将文件场景直接拖进去
2、常规设置
File=》Build Setting=》Play Settings
Company Name:企业/发布人名称
Product Name:游戏名称
Version:游戏版本号
Default Icon:游戏图标
Default Cursor:游戏鼠标
3、Build