Bootstrap

unity入门

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

;