Unity游戏开发基础组件

news2025/2/22 19:22:59

Unity2D

相机调整:Projection设置为Orthographic。也就是正交模式,忽视距离。
资源:
Sprite:一种游戏资源,在2D游戏中表示角色场景的图片资源
SpriteSheet:切割一张图片为多个Sprite
在Sprite Editor中可以切割图片,要在Package Manager中下载2D Sprite包。
图片可以更改中心点(拖动中间的圆圈),也可以设置Custom Pivot。这决定了图片怎么显示。
SpriteRenderer组件参数设置:
Sprite:设置图片
Color:给图片叠加颜色
Flip:翻转
SortingLayer:排序层
OrderinLayer:排序值,当排序层相同时由这个值决定层级顺序

物理系统:
我们可以在Project Settings中的Physics 2D来进行相关的设置,例如Gravity可以设置重力加速度的大小和方向。
首先,我们需要在物体上挂载Rigidbody2D的组件。设置参数如下
BodyType:
Dynamic:动态,最仿真的。
Kinematic:运动,由代码控制。
Static:静态,不是为了移动设计的。
Simulated:是否模拟,不模拟没有重力碰撞等。
Mass:质量。
Linear Drag:位置移动的阻力系数。
Angular Drag:旋转移动的阻力系数
Is Kinermatic:如果只让代码控制物体而不是真实的物理模拟,勾选此项
Gravity Scale:重力系数
Collision Detection:定义如何检测2D物体之间的碰撞。
Constraints:定义对2D刚体运动的任何限制。
Material:物理材质,可以弄一个物理材质球来进行赋值,可以设置弹性和摩擦系数。

private Rigidbody2D rigidbody2D = GetComponent<Rigidbody2D>();
rigidbody2D.velocity = new Vector2(0,1);   //改变速度
rigidbody2D.AddForce(Vector2.up);   // 施加力

如果不仅需要重力,还需要与其他物体发生碰撞,就需要加碰撞体组件。碰撞事件至少需要有一方有刚体。
可以点击Edit Collider直接可视化编辑碰撞体尺寸。
而碰撞的检测主要靠代码完成:

// 碰撞进入
private void OnCollisionEnter2D(Collision2D col){
  if(col.gameObject.tag == "Bullet"){
    print("子弹击中");
    Destroy(collision.gameObject);
  }
}
// 碰撞中
private void OnCollisionStay2D(Collision2D col){
  
}
// 碰撞退出
private void OnCollisionExit2D(Collision2D col){
  
}

触发器和碰撞器同理,区别是触发器不会阻挡物体,只负责检测碰撞,只需要把碰撞器组件的is Trigger勾选上就变成触发器了,代码如下:

private void OnTriggerEnter2D(Collision2D col){
  if(col.gameObject.tag == "Bullet"){
    print("子弹击中");
    Destroy(collision.gameObject);
  }
}
// 应用这个需要把Rigidbody2D中的Sleeping Mode改为Never Sleep,否则会休眠
private void OnTriggerStay2D(Collision2D col){
  
}
private void OnTriggerExit2D(Collision2D col){
  
}

游戏输入介绍

主要有:键盘,鼠标,摇杆,手机触摸屏。

// 按键按下,持续按,弹起
if(Input.GetKeyDown(A)){
  // 按下A瞬间发生的事
}
if(Input.GetKey(A)){
  // 持续按A的过程中发生的事
}
if(Input.GetKeyUp(A)){
  // 弹起A瞬间发生的事
}

if(Input.GetMouseButtonDown(0)){
  // 按下鼠标左键瞬间
}
if(Input.GetMouseButton(0)){
  // 持续按鼠标左键
}
if(Input.GetMouseButtonUp(1)){
  // 弹起鼠标右键瞬间
}
print(Input.mousePosition); // 输出鼠标位置,三维但第三维是0,其他两维越往左下角越小

在Edit -> ProjectSettings -> InputManager中可以设置输入按键。
在这里插入图片描述

用法:

// 好处是会在-1到1中平滑过度
float h = Input.GetAxis("Horizontal");
// 没有过度的用法
float c = Input.GetAxisRaw("Horizontal");
// 鼠标滚轮,向上和向下为0.1和--0.1固定值
float v = Input.GetAxis("Mouse ScrollWheel"); 

UI部分

Unity2D在于SpriteRenender和2D物理系统的组成,而UI在于由Canvas以及各种UI组件组成,始终附着于屏幕上,不轻易移动。
创建方法:层级面板右键菜单,里面的UI的子菜单有各种UI可以创建。
所有的UI默认都会在一个画布Canvas上创建。并且自带一个EventSystem,让我们按钮等功能可以互动。下面说一下各种组件:

Image

Image:图片组件,属性如下
  SourceImage:源图片,脚本中叫Sprite。注意在使用之前需要按Unity2D的方法对图片进行处理(切片等)
  Color:图片的叠加色
  RaycastTarget:是否可以作为射线目标,后续的点击拖拽需要使用。
  Set Native Size:恢复图片的原始尺寸。
  ImageType:显示模式
    Simple:普通模式
    Sliced:切片
    Tiled:平铺
    Filled:填充,血条进度条等使用。
using UnityEngine;
using UnityEngine.UI;

public class Demo_Image:MonoBehaviour{
  private Image image;
  void Start(){
    image = GetComponent<Image>();
    image.color = Color.black;
  }
}

Text

Text:文本组件
  Text:文本内容
  Font:字体
  Font Style:字体样式,主要是加粗、斜体
  Font Size:字体大小
  Line Spacing:字间距
  RichText:富文本,有Html相关经验可以使用,否则无视
  Color:字体颜色
  Raycast Target:是否可以作为射线检测目标,可以进行点击拖动等。

Button

Button:按钮组件,由Image和Text以及Button功能组成。
  Image:Button物体本身的组件,使用方法同上
  Text:Button物体的子物体,使用方法同上
  Button:Button物体的组件
    Interactable:可交互,决定按钮是否有效。
    Transition:过渡方式,一般选择Color Tint改变颜色。选择Sprite Swap改变的是图片。
      Target Graphic:改变的Image。
      Normal Color:正常颜色
      Highlighted Color:鼠标放在上面的颜色
      Pressed Color:鼠标按下去的颜色
      Selected Color:鼠标按下去松开之后的颜色
      Dsabled Color:按钮不可交互的颜色
    Navigation:使玩家可以通过wsad和方向键来选择按钮。
    OnClick():按钮的交互事件,把需要执行的脚本挂载到物体上,把物体拖过来选择相应的方法即可。为了方便我们可以用代码进行操作。
Using UnityEngine;
Using UnityEngine.UI;

public class Button_Click:MonoBehaviour{
  Button button;
  void Start(){
    button = GetComponent<Button>()
    button.OnClick.AddListener(ButtonClick);  //代码监听事件,不用在Unity编辑器中拖拽物体了
  }

  public void ButtonClick(){
    Debug.Log("Button Click");
  }
}

InputField

InputField:输入框组件
  Image:InputField挂载的组件,用于显示背景图片。
  Placeholder:InputField的子物体,挂载text脚本,用于玩家没有输入时的文本。
  Text:InputField的子物体,挂载text脚本,接受玩家输入。
  Input Field:InputField本身的组件,部分于Button一致
    Text Component:接收输入的文本组件
    Placeholder:显示默认输入的文本组件
    Content Type:约束输入的内容
    On Value Changed:输入值改变的事件,与按钮同理
    On End Edit:输入结束时的事件
Using UnityEngine;
Using UnityEngine.UI;

public class Button_Click:MonoBehaviour{
  InputField inputField;
  void Start(){
    inputField = GetComponent<InputField>()
    inputField.onValueChanged.AddListener(OnValueChanged);  
    inputField.onValueChanged.AddListener(OnEndEdit);  
  }

  public void OnValueChanged(string value){
    Debug.Log(value);
  }
  public void OnEndEdit(string value){
    Debug.Log(value);
  }
}

Toggle

Toggle:切换组件,由一个文本和一个选择框构成
  Background:Toggle的子物体,挂载Image组件决定选择框背景
    Checkmark:Background的子物体,挂载Image组件决定选中后的选择框图片(打勾)
  Label:Toggle的子物体,挂载Text组件显示文本
  Toggle:Toggle本身挂载的组件,上面的部分属性和Button相同
    isOn:是否被勾选上
    Group:重要功能,我们需要多选一时,把多个Toggle放到一个父物体下,父物体挂载ToogleGroup组件,然后拖拽父物体到这里就能实现。

Using UnityEngine;
Using UnityEngine.UI;

public class Button_Click:MonoBehaviour{
  Toggle toggle;
  void Start(){
    toggle = GetComponent<Toggle>()
    toggle.onValueChanged.AddListener(OnValueChanged);  
  }

  public void OnValueChanged(bool value){
    Debug.Log(value);
  }

}

Slider

Slider:滑块组件
  Background:Slider的子物体,挂载Image组件决定了滑块的背景图片。
  Fill Area:Slider的子物体
    Fill:Fill Area的子物体,挂载Image滑块填充物的图片
  Handle Silde Area:Slider的子物体
    Handle:Handle Silde Area的子物体,挂载Image用于滑块的图片
  Slider:Slider本身的组件,部分参数和Button相同
    Direction:决定了滑块的方向
    Min Value:最小值
    Max Value:最大值
    Whole Numbers:数值是否为整数
    On Value Change:值改变时发生的事件

Using UnityEngine;
Using UnityEngine.UI;

public class SliderDemo:MonoBehaviour{
  Slider slider;
  void Start(){
    slider = GetComponent<Slider>()
    slider.onValueChanged.AddListener(OnValueChanged);  
  }
  public void OnValueChanged(float value){
    Debug.Log(value);
  }

}

Scrollbar

Scrollbar:滚动条组件,和滑块类似,但只有背景色没有填充色,且数值范围固定为0到1
  Scrollbar:本身的组件,和Slider相比只有一个不同
    Number of Steps:滚动条有多少个可以选择的值

DropDown

DropDown:下拉菜单组件
  Image:挂载在DropDown本身,背景图片
  Dropdown:挂载在DropDown本身,部分和Button相同
    Caption Image:所需要改变的图片
    Options:选项文本和图片
    Value:现在的值,0为第一个,1为第二个,以此类推
    Alpha Fade Speed:菜单的显现速度
    On Value Changed:事件
  Label:DropDown子物体,挂载Text用于调整文本
  Arrow:DropDown子物体,挂载Image用于下拉箭头
  Template:菜单模板
    Viewport:遮罩
      Content:
        item:挂载toggle
          item Background:挂载Image,下拉菜单背景图
          item Checkmark:挂载Image,下拉菜单前面的勾
          item Label:挂载Text,决定文本
Using UnityEngine;
Using UnityEngine.UI;

public class DropDownDemo:MonoBehaviour{
  DropDown dropdown;
  void Start(){
    dropdown = GetComponent<DropDown>()
    dropdown.onValueChanged.AddListener(OnValueChanged);  
  }
  public void OnValueChanged(int value){
    Debug.Log(value);
  }
}

Scroll View

遮罩组件Mask:当一个物体(例如Image)有这个组件的时候,它的子物体只有在它的范围内才可见,其他部分隐藏,相当于一个显示特定范围的窗口。

Scroll View:滚动视图
  Image:挂载在ScrollView本身,用于显示背景
  ScrollRect:本身的组件
    Horizontal:能否横向移动
    Verical:能否纵向移动
    Movement Type:决定如何移动
    Scroll Sensitivity:鼠标滚轮的灵敏度
    Horizontal Scrollbr:
      Visibility:是否隐藏
    Verical Scrollbr:
      Visibility:是否隐藏
    OnValueChange:事件,传过去的是Vector2的值
  Viewport:有个遮罩组件
    Content:展现内容
  Scrollbar Horizontal:横的滚动条
  Scrollbar Vertical:竖的滚动条

Using UnityEngine;
Using UnityEngine.UI;

public class ScrollViewDemo:MonoBehaviour{
  ScrollRect scrollRect;
  void Start(){
    scrollRect = GetComponent<ScrollRect>()
    scrollRect.onValueChanged.AddListener(OnValueChanged);  
  }
  public void OnValueChanged(Vector2 value){
    Debug.Log(value);
  }
}

Grid Layout Group

类似背包这种想要排列整齐的时候一般使用这个组件,会自动管理其下方所在其他UI元素的大小、位置等信息,层级面板不能直接创建这个组件,需要创建空物体(可以创建Image作为背景),手动添加这个组件。

Grid Layout Group:表格布局组件
  Image:可以在这个组件的子物体下挂载多个Image,会自动排列整齐,也可以排其他UI
  Grid Layout Group属性:
    Pedding:边距
      Left、Right、Top、Botton。
    Cell Size:格子大小
    Spacing:格子间距
    Start Corner:从哪个角开始排列

Rect Transform

一个UI元素在Canvas下时,属性不是Transform而是Rect Transform。属性如下:

  1. PosX,PosY,PosX:中心点的位置,z一般为0
  2. width,height:宽高
  3. Pivot:UI上中心点的位置,XY轴的范围都为0-1,旋转移动都围绕中心点进行
  4. anchors:左上角图标,相对于父物体的定位,可以弹性布局,重要

Canvas

场景中的画布是可以存在很多个的。有三个组件构成:

Canvas:画布
  Render Mode:Screen Space-Overlay表示始终位于屏幕最上层。Screen Space-Camera表示将Canvas位于相机前方,中间的2D/3D物体可以显示在UI上,可以用来展示模型。World Space表示Canvas作为一个游戏对象显示在3D场景中
Canvas Scaler:画布比例
  UI Scale Mode:Constant Pixel Size为固定像素,不随屏幕尺寸发生变化。Scale With Screen Size适应屏幕大小。
Graphic Raycaster:射线检测

UI事件

脚本需要继承事件接口,实现对应方法:
IpointerClickHandler:鼠标点击
IPointerDownHandler:鼠标按下
IPointerUpHandler:鼠标弹起
IPointerEnterHandler:鼠标进入
IPointerExitHandler:鼠标退出
IBeginDragHandler:开始拖拽
IDragHandler:拖拽中
IEndDragHandler:停止拖拽

using UnityEngine;
using UnigtyEngine.EventSystems;

public class UIEvent:MonoBehaviour,IPointerClickHandler,IPointerDownHandler,IPointerUpHandler,IPointerEnterHandler,IPointerExitHandler
{
  public void OnPointerClick(PointerEventData eventData){
    Debug.Log("good");  
  }
  public void OnPointerDown(PointerEventData eventData){
    Debug.Log("good");  
  }
  public void OnPointerUp(PointerEventData eventData){
    Debug.Log("good");  
  }
  public void OnPointerEnter(PointerEventData eventData){
    Debug.Log("good");  
  }
  public void OnPointerExit(PointerEventData eventData){
    Debug.Log("good");  
  }

}

Unity3D

3D和2D同理,只是多了一个z轴而已,2D中讲过的知识不再赘述。
相机调整:如果我们想将相机移动到窗口中的视角,可以选中相机后,点击GameObject->Align With View。

物理射线

用于判断是否命中,点击地面,建造物等功能。

Using UnityEngine;

public class RayDemo:MonoBehaviour{
  void Start(){

  }

  void Update(){
    Ray ray = new Ray(Vector3.zero,new Vector3(0,1,0)); //起点终点定义一条射线
    Ray ray2 = Camera.main.ScreenPointToRay(Input.mousePotition); //鼠标点击的射线
    if(Physics.Raycast(ray)){
      Debug.Log("碰撞到物体了");
    }
    if(Physics.Raycast(ray,out RaycastHit hitinfo,1000)){ //第二个参数是碰撞信息,第三个是距离
      Debug.Log(string.Format("碰撞到物体{0},在{1}位置",hitinfo.collider.gameObject.name,hitinfo.point));
      Debug.DrawLine(ray.origin,hitinfo.point,Color.Red);//绘制射线
    }
  }

}


Rigidbody

刚体移动:
Rigibody.MovePosition(Vector3 target);
target是一个具体要到达的位置

Using UnityEngine;

public class RigidbodyMoveDemo:MonoBehaviour{
  private Rigidbody rb;
  void Start(){
    rb = GetComponent<Rigidbody>();
  }
  void FixUpdate(){
    Move();
  }
  void Move(){
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Verical");
    Vector3 offset = new Vector3(h,0,v) * 0.02f;
    rb.MovePosition(offset + transform.position);
  }
}

预制体的实例化

需求:用预制体在游戏中生成很多相同的物体,例如怪物,小兵等

using UnityEngine;
public class GenerateCube:Monobehaviour{
  public GameObject prefab_cube;
  private void Update(){
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    // 鼠标点击的地方生成物体
    if(Input.GetMouseButtonDown(0) && Physics.Raycast(ray,out RaycastHit hitinfo,1000)){
      GameObject cube = GameObject.Instantiate(prefab_cube,hitinfo.point,Quaternion.identity,transform);
    }
  }
}

Unity渲染基础

相机

Unity中的相机负责将游戏画面投放到玩家屏幕上,刚开始系统会默认存在一个Main Camera来显示画面。相机也是一个物体,它的移动导致画面的改变。
属性设置:
Clear Flags:没有物体时显示的背景,默认为Skybox(天空盒),还可以是Solid Color(纯色)。Depth Only,Don’t Clear用于多个相机同时工作。
Culling Mask:决定相机能看到哪些层
Field of View:视野大小
Clipping Planes:设置最远能看到的距离,无法观察到的贴身距离

灯光

灯光主要影响明暗程度以及阴影。Unity能模拟不同的光源如:太阳,手电筒,电灯,萤火虫等。
灯光也是一个组件,我们可以创建空物体,并添加Light来实现。也能通过右键菜单的light来实现,光源种类有:
Directional Light:平行光,一般为太阳光,全局都能照到,通过旋转能实现昼夜交替的效果。
Point Light:点光源,最常用
Spotlight:聚光灯
AreaLight:面积光,需要进行烘焙,对静态物体有用

灯光一般可以调节颜色,范围,强度,实时或者烘焙或者混合,灯光反射
光源可以分为实时的和烘焙的,实时的只对非静态的移动物体有效,烘焙的只对静态物体有效。
灯光烘焙
Window->Rendering->Lighting Settings进入
Skybox Material:可以设置天空盒的材质
在最下方的Generate Lighting按钮可以进行烘焙

Shader

渲染管线主要分类:

  • Build-in Render Pipeline(内置渲染管线):默认的渲染管线
  • Universal Render Pipline(通用渲染管线):性能较好
  • HD Render Pipline(高清渲染管线):以画面为主,偏向高端机器和影视的渲染管线

Shader是渲染管线的算法片段,用于告诉图形硬件如何计算和输出图像。Shader的制作基于某个渲染管线,不具备通用性,可以让模型展现出不同的效果,比如风格化等。这不是入行的必备知识,知道其作用和使用方式即可。

使用方式:将shader附加给材质球,材质球附加给网格渲染器。

粒子系统

游戏中的下雨、下雪、法球和一些技能特效都是基于粒子完成,制作由特效师完成,我们只需要使用即可。
右键菜单Effects->Particle System可以创建一个基础的粒子特效
我们只需要学习基础的Particle System的属性使用就可以了
Duration:持续事件,多少秒后不再发射粒子
Looping:是否循环播放
Start Lifetime:粒子发射出去后多少秒消失
Play On Awake:是否立刻播放粒子
Stop Action:是否在播放结束时销毁自己

动画系统

游戏动画一般指模型的动作,我们只需知道动画的运行原理,不是动画设计师的我们不会过于深入动作本身的设计。我们的学习重点是给角色配置动作、切换动作、代码控制动作等。
想要让一个角色拥有动画,需要几个步骤:

  1. 挂载Animator组件
  2. 给Animator组件配置Controller,我们需要右键菜单创建一个,赋值给它
  3. 双击Controller可以打开Animator窗口,我们需要在这里配置动画
  4. 我们可以把动画的片段拖动进来,通过配置各种状态转换的关系达到目的,右键菜单创建的Animation可以创建动画片段(一般由美术提供)

简要动画制作:

  1. 双击动画片段可以打开Animation窗口,可以在这里编辑具体的动画
  2. Preview可以查看Animator拥有的动画片段
  3. 点击红色圈可以开始录制动画,我们可以随意拖动物体到我们想要的姿势,再次点击红圈结束录制,点击播放按钮后动画会以平滑的方式完成转变。

Animator Controller

配置动画片段:单击Animation片段,可以看到有几个属性可以设置,Loop Time代表动画是否循环播放,Loop Pose让收尾连接更平滑。

  1. 首先Animator默认有三个状态,Entry是起始点,Any State是指任何状态,方便我们进行一些转换操作,Exit指退出,不再执行动画。
  2. 对着拖进来的动画片段点击右键,Make Transition可以设置连接关系,Set as Layer Default State可以设置默认状态。
  3. 点击连接Animation的箭头,一般我们用代码控制特定变量的改变,然后就能在Conditions里设置转换条件,我们可以在Animator窗口的Parameters中设置特定变量
  4. Has Exit Time代表是否播放完动画再转换状态
  5. Settings中的Fixed Duration代表是否有动画过渡,并可以设定过渡时间
  6. 单击动画片段块,我们可以设置属性,Speed代表动画播放速度。下面的Transitions可以设置转换的哪个状态单独有效(solo),或者哪个无效(Mute)

代码控制:

using UnityEngine;

public class AnimatorDemo:MonoBehaviour{
private Animator animator;
  void Start(){
    animator = GetComponent<Animator>();
  }
  void Update(){
    if(Input.GetKeyDown(KeyCode.Space)){
      animator.SetTrigger("跳一跳");  //改变Int,float,bool值同理
      
    }
  }
}

注意:需要在Parameters中设置以“跳一跳”为名的Trigger变量,然后在转换箭头中设置好transition。

人性角色的骨骼结构是一致的,我们需要有Avatar映射文件,可以让动作复用。

动画事件

在Animation窗口中,我们选中一个动画,选中一帧,然后点击Add event(一个白色柱状下方一个小尖的标志),这样就可以在这一帧添加一个事件,我们可以在这里执行想要的方法,可以从该物体挂载的脚本下选择。
注意:如果是导入的模型,可能无法在animation界面添加事件,我们需要找到对应的动画模型,点击Inspector中的Animation,下方有一个Event的属性,可以进行设置。但不支持两个及以上的事件。

角色控制器组件

首先,我们给需要控制的物体挂载Character Controller组件。设置参数:

  • Slope Limit:最大爬坡的角度,45指最大能爬45度的坡
  • Step Offset:最高能无视多少高度的阶梯
  • skin Width:皮肤厚度,相当于一个隔空的碰撞器
  • Min Move Distance:最小的移动距离,小于该值不会移动
  • Center:碰撞器的中心
  • Radius:碰撞器半径
  • Heiget:碰撞器高度
    注意:角色控制器所在的游戏物体不需要碰撞体和刚体
using UnityEngine;

public class CCDemo:Monobehaviour{
  private CharacterController characterController;
  void Start(){
    characterController = GetComponent<CharacterController>();
  }
  void Update(){
    Debug.Log(characterController.isGrounded);
    float h = Input.GetAxis("Horizontal");
    float v = Input.GetAxis("Verical");
    //Vector3 dir = new Vector3(h,-9.8f,v); //-9.8模拟重力
    //characterController.Move(dir * Time.DeltaTime * 10);

    characterController.SimpleMove(dir * 10)//传入速度,并且不会被帧率影响,并且包含重力
  }

}

导航系统

功能需求:我们点击地图上得某个位置,角色需要自动跑到这个位置,并且还具有规避障碍物的功能。
以上的功能叫导航,也叫寻路,用到的组件是NavMeshAgent。
在导航之前,我们需要确定哪些地方是能去的,哪些是不能去的:

  1. 我们把所有不能动的物体全部勾上static
  2. Window->AI->Navigation->Bake->Bake
  3. 烘焙之后场景中蓝色的部分就是角色可以去的地方

然后我们就可以在角色上挂载并设置NavMeshAgent组件了:
Base Offset:导航组件碰撞体的高度
Speed:导航速度
Angular:导航旋转速度
Acceleration:导航加速度
Stopping Distance:判定到达终点的停止距离
Auto Braking:到达终点自动停止
Radius:导航碰撞体半径
Height:导航碰撞体高度
Quality:质量越高越智能

使用方法:

using UnityEngine.AI;
using UntiyEngine;

public class NavDemo:MonoBehaviour{
  public NavMeshAgent agent;
  public Transform target;

  void Start(){
    agent = GetComponent<NavMeshAgent>();
  }
  void Update(){
    agent.SetDestination(target.position);
    if(Input.GetKeyDown(KeyCode.Space){
      agent.isStopped =  !agent.isStopped;
    })
  }

}

Navigation面板

Window->AI->Navigation进入面板,上面使用的是烘焙(bake)功能。
Agents面板不常用,不作讲解,在多个导航网格对应不同的agent类型使用,有需要可以查阅官方资料。
Areas面板用来区分区域,不同的区域行走代价不同,陆地比沼泽走得更快,导航会选择行走代价低的地方进行。但是,这并不会影响到实际的行走速度,行走速度由代码控制,这里只是另外设定的一个代价值而已。
Object面板,点击一个静态物体后,上面有一个Navigation Area的选项,可以选择Areas面板的设定值,决定在上面行走的行走代价。

NavMeshObstacle

有的时候,我们需要动态生产障碍物(例如释放阻拦型技能),我们也需要把它放进导航的考量范围内。我们只需要给生成的障碍物添加NavMeshObstacle组件即可。正常设置障碍物的导航碰撞体形状即可,勾上属性Carve后即可把障碍物考虑在内。

资源管理

资源导出

当我们想把某些游戏资源打包发给别人的时候,我们选中资源->右键菜单->Export Package
注意:资源上的材质球等信息如果不和预制体一起导出,会导致预制体材质球丢失,其他同理。导入时直接拖拽即可

Resource资源加载

当我们需要把资源动态地加载近游戏中,我们需要创建一个Resources文件夹,在什么地方都可以,多个Resources文件夹路径会合并。
代码加载:

private GameObject prefab_cube;
prefab_cube = Resources.Load<GameObject>("Prefabs/Cube");//参数传入Resources文件夹下的路径

数据存档

单机游戏的数据存放在本地,网络游戏重要数据存放在服务端的数据库,不关键的数据存放在本地。PlayerPrefs是Unity为我们提供的方式。
数据储存在注册表HKEY_CURRENT_USER/Software[company name][product name]下
打开方式cmd中regedit.exe

// 储存数据
PlayerPrefs.SetString("PlayerName","Xiaoxing");
PlayerPrefs.SetFloat("Distance",2.2f);
PlayerPrefs.SetInt("Age",24);

// 获取数据
if(PlayerPrefs.HasKey("Age")){
  int Age = PlayerPrefs.GetInt("Age");
}
if(PlayerPrefs.HasKey("PlayerName")){
  string playerName = PlayerPrefs.GetString("PlayerName");
}


// 删除数据
PlayerPrefs.DeleteAll();          //全部数据
PlayerPrefs.DeleteKey("Name");   //指定数据

游戏场景加载

很多时候,我们不能在一个场景中完成所有的事情,需要根据功能划分场景,例如:登录场景,游戏大厅,战斗场景等

场景切换

前提:场景必须被打包,在File->Build Setting中把场景拖拽金Scenes In Build,排序第一的作为开场场景。

using UnityEngine;
using UnityEngine.SceneManagement;

public class SceneDemo:MonoBehaviour{
  void Update(){
    if(Input.GetKeyDown(KeyCode.A)){
      SceneManager.LoadScene(1);         //加载第二个场景
      SceneManager.LoadScene("Scene");   //加载对应名称的场景
    }
  }
}
数据保留

加载场景默认销毁上一个场景所有物体,如果想保留部分物体:

GameObject.DontDestroyOnLoad(gameObject); // 保留自身

声音系统

在相机上有一个AudioListener组件,没有它玩家听不到声音。这个东西相当于声音接收器,声源近则声音大,并且有左右声道。
相对地,发出声音的物体身上挂载的是AudioSource组件。
AudioClip:声音片段
Mute:是否静音
Play On Awake:生成游戏物体时立刻播放音频
Loop:循环播放
Volumn:音量
Pitch:音调,默认为1,值越大,速度越快,音调越高
Stereo Pan:声道占比

AudioSource audiosoruce;
public AudioClip clip;
audioSource.clip = clip;
audioSource.Play();
audioSource.Stop();
if(audioSource.isPlaying)
  audioSource.Pause();
audioSource.UnPause();

audioSource.PlayOneShot(clip); //播放一次,可以叠加

Windows打包发布

把Unity的工程项目变成玩家可以打开的exe文件
File->Build Setting->Player Setting
这里可以设置公司名称,产品名称版本等信息
Default Cursor:有两张图片,第一张设定游戏图标,第二张设置鼠标指针图标
Resolution and Presentation:
Fullscreen:窗口还是全屏运行
Default is Native Resolution:打勾代表自动设置分辨率,否则要手动设置

一切设定玩了后可以点击Build,选择路径,游戏就能顺利导出到对应路径啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1189194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git 入门使用 —— 建库、代码上下传、常用命令

目录 一、Git 入门 1.1 Git简介 1.2 Git安装 1.3 创建码云仓库 二、Git 使用 2.1 git初始化操作 2.2 代码上传 2.3 代码下载 2.4 代码更新 2.4.1 仓库管理者 2.4.1 仓库使用者 三、Git 常用命令 一、Git 入门 1.1 Git简介 Git是一个开源的分布式版本控制系统&am…

Vue3+vite+cesium环境搭建

引言 目前有不少vue3cesium的配置教学&#xff0c;存在以下两个问题&#xff1a; &#xff08;1&#xff09;vue3cli方式&#xff0c;随着项目的迭代&#xff0c;npm run serve 启动调试很慢&#xff1b; &#xff08;2&#xff09;vue3vite 确实能将调试启动提升不少的&…

CloudCompare 技巧五 CSF 体积计算等

42、CSF 原始点云 我这路要的是地面分离出来&#xff0c;所以我选的是Flat 结果如下&#xff1a; 43、点云超欠挖体积计算 结果&#xff1a; 44、 网格表面积体积测量 45、法向量

驾考在线答题系统源码:含PC+手机版驾考宝典多题库

安装说明&#xff1a; 1、上传到网站根目录 2、用 phpMyadmin 导入数据库文件 db.sql 3、修改数据库链接文件 /ThinkPHP/Conf/convention.php# &#xff08;记得不要用记事本修改&#xff0c;否则可能会出现验证码显示不了问题&#xff0c;建议用 Notepad 4、 帐号 admin 密码…

一文带您了解云渲染

很多刚刚接触云渲染的网友可能还不太了解云渲染&#xff0c;不知道云渲染是什么&#xff0c;不知道如何选择云渲染&#xff0c;不知道云渲染怎么收费&#xff0c;今天小编归纳总结了一些网友比较关心的问题&#xff0c;在本文中一一为大家解答。 云渲染是什么&#xff1f; 云…

RT-Thread 组件学习

FinSH控制台 在计算机发展的早期&#xff0c;图形系统出现之前&#xff0c;没有鼠标&#xff0c;甚至没有键盘。那时候人们如何与计算机交互呢&#xff1f;最早期的计算机使用打孔的纸条向计算机输入命令&#xff0c;编写程序。 后来随着计算机的不断发展&#xff0c;显示器、…

echart的tooltip显示不同的单位

效果 实现 在每个series中添加不同的 tooltip: { valueFormatter: function (value) { return value.toFixed(0) ‘A’; } }, 代码如下 var option {// grid: {// left: -13vw,//左边距72px// right: 32%,// bottom: 64%,// top:…

LaMa 论文复现:Resolution-robust Large Mask Inpainting with Fourier Convolutions

代码&#xff1a;GitHub - andy971022/auto-lama 论文&#xff1a;https://arxiv.org/abs/2109.07161 1 LaMa 论文简介 2 LaMa代码复现 2.1 环境部署 2.1.1 下载源码&#xff0c;创建环境&#xff0c;安装必需库 git clone https://github.com/advimman/lama cd lama con…

JAVASSMmysql面向高校校园体育用品租借管理系统94593-计算机毕业设计项目选题推荐(附源码)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序的面向高校校园体育用品租借管理系统被用户普遍…

Git->git简介,git的常用命令,git命令的常用理论

git简介git的常用命令git命令的常用理论 1.git简介 Git是什么&#xff1f; Git是一个开源的分布式&#xff0c;用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVSI…

在任何机器人上实施 ROS 导航堆栈的指南

文章目录 路径规划参考 路径规划 路径规划是导航的最终目标。这允许用户向机器人给出目标姿势&#xff0c;并让它在给定的环境中自主地从当前位置导航到目标位置。这是我们迄今为止所做的一切&#xff08;地图绘制和本地化&#xff09;的汇集点。ROS 导航堆栈已经为我们完成了…

教培管理系统源码 教育培训机构系统源码 教务系统源码

教培管理系统源码 教育培训机构系统源码 教务系统源码 功能介绍&#xff1a; 教务中心: 学员管理 班级管理 课表管理 教师管理 课程/收费 上课记录 家校互动: 课后作业 课后点评 成绩单 成绩档案 通知管理 营销中心&#xff1a; 活动模板 我的活动 销售中心&am…

双十一数码好物推荐,盘点那些错过等一年的好物!

双十一购物狂欢节马上到来&#xff0c;对于热爱数码产品的人来说&#xff0c;双十一无疑是一个绝佳的时机&#xff0c;因为许多知名品牌和零售商都会推出各种令人心动的数码好物促销活动。从佩戴服饰到大件智能装备&#xff0c;再到健康科技产品&#xff0c;市场上的选择多种多…

竞赛 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计 图像识别 深度学习 身份证识别…

四川芸鹰蓬飞商务信息咨询有限公司电商服务引领潮流

在今天的数字时代&#xff0c;抖音带货已成为一种新型的、高效的营销方式。许多公司都在寻找可靠的抖音带货服务&#xff0c;以扩大其品牌影响力并增加销售额。在这方面&#xff0c;四川芸鹰蓬飞商务信息咨询有限公司以其专业的知识和经验&#xff0c;成为行业内的佼佼者。 四…

画家尹星,美术界的扫地僧

尹星 简历&#xff1a; 1944年1月25日出生于山西省阳高县&#xff0c;内蒙古师范学院艺术系美术专业&#xff0c;师从水彩之父李剑晨&#xff0c;北京京华美术学院创立者邱石冥&#xff0c;徐坚。与吴冠中&#xff0c;朱德群&#xff0c;赵无极&#xff0c;杨飞云是同门。擅长…

【EI会议征稿】JPCS独立出版-第五届新材料与清洁能源国际学术会议(ICAMCE 2024)

JPCS独立出版-第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09; 2024 5th International Conference on Advanced Material and Clean Energy 第五届新材料与清洁能源国际学术会议&#xff08;ICAMCE 2024&#xff09;将于2024年2月23-25日在中国▪长沙…

采集Prestashop独立站采集Prestashop独立站

import java.net.URL 这一行导入了Java.net包中的URL类&#xff0c;这个类在处理URL链接时非常有用。 import org.jsoup.Jsoup 这一行导入了Jsoup库&#xff0c;它是一个强大的HTML和XML文档解析库&#xff0c;我们可以使用它来解析网页内容。 import org.jsoup.nodes.Docume…

安卓数据恢复工具哪个强? 10 个最佳 Android 数据恢复应用程序

如果您是 Android 用户并且已经使用您的设备一段时间&#xff0c;那么您很可能遇到过与数据相关的问题。这可能是由于软件问题导致文件被意外删除或损坏。许多人不经常备份数据&#xff0c;从而丢失了重要的文档、图像、视频文件等。最糟糕的是&#xff0c;数据丢失可能随时发生…

AI智能雷达名片平台版小程序源码系统 带完整的搭建教程

大家好啊&#xff0c;今天源码小编来给大家分享一款AI智能雷达名片平台版小程序源码系统。人工智能技术的不断发展和普及&#xff0c;越来越多的企业开始应用AI技术来提高业务效率和提升用户体验。AI智能雷达名片平台版小程序源码系统就是利用人工智能技术&#xff0c;帮助企业…