Unity学习 简单案例

下载Unityhub,下载合适的引擎版本

跟着社区学习教程做一个简单的2D游戏Ruby's Adventure:2D 初学者 | Unity 中文课堂 (u3d.cn)

使用2D核心模版创建项目,在资源商店将教程资源添加到"我的资源",在Unity的package manager窗口导入资源进项目,注意因为版本的原因可能需要在package manager里更新一些插件.

窗口

默认窗口

顶部菜单栏

File:可以新建/打开/保存场景/项目,设置Build选项

顶部工具栏

运行/暂停/运行一帧

Project

  • 显示项目所有资源
  • 可以在这里创建对象
  • 预制件,将对象存为预制件,可以在运行中动态的实例对象

Inspect

  • 显示选中对象的组件/属性
  • 下方Add Component按钮添加组件,也可以输入脚本名创建脚本
  • 拖入脚本添加脚本组件

Hierarchy

  • 打开一个Scenes,在此显示所有对象,通过缩进表示对象间的层级关系
  • 左键选择对象
  • 右键Create或者拖入资源添加默认位置的游戏对象

Scene

  • 场景布局
  • 右上2D可控制视图模式,此处应保持按钮亮起
  • 左侧工具栏,飞跃/对象移动/旋转/缩放/矩形工具/变形
  • 左键选中对象,右键飞跃
  • 拖入资源,在拖入位置生成对象

Game

  • 游戏运行预览窗口
  • 更改摄像机属性调整显示区域

Console

  • 游戏信息显示窗口,可以点击弹出浮动窗口,游戏内检测到的错误都会在这里显示,也可以显示自定义信息
  • 顶部按钮Collapse:折叠重复信息

可添加窗口

Package Manager

  • 顶部菜单栏Windows下拉列表点击Package Manager打开
  • 更新导入包,包括素材包

Tile palette

  • 顶部菜单栏Windows下拉列表2D > Tile palette打开
  • Create New Palette:新建面板
  • 拖入精灵生成瓦片对象
  • 工具栏:选择/移动/绘制/填满箱子/吸管/擦除/填满
  • 选中瓦片并使用绘制工具,可以在Tilemap上绘制地图

Sprite Editor

  • 选中图片文件,Inspect窗口点击Sprite Editor按钮打开
  • Slice:切割图片

Animation

  • Create创建新动画
  • Add Property添加属性
  • 也可以直接拖入精灵创建连续帧

Animator

  • Parameters:添加各种属性来控制动画
  • Blend Tree:混合树

系统模版对象

2D Object->Tilemap:瓦片地图

精灵

  • 由Unity支持的图像文件可以生成精灵,默认剪辑全部范围生成一个精灵
  • 拖动精灵到Scene或Hierarchy窗口生成有Sprite Renderer组件并引用此精灵,位置为拖入位置或者默认位置的对象
  • Sprite Mode:Single整体生成一个精灵,Multiple切割多个精灵
  • Pixels Per Unit:每单位像素
  • Mesh Type:填充类型
  • Sprite Editor:打开Sprite Editor窗口,对图片与精灵做多样操作

组件

  • Transform:x/y/z方向的位置和比例和大小
  • Sprite Renderer:在对象位置处绘制一个精灵,Sprite Sort Point设置锚点是对象中心还是精灵锚点,Draw Mode绘制模式
  • RigidBody2D:物理系统,Gravity Scale重力,Freeze Rotation禁用旋转,Sleeping Mode静止时是否休眠
  • BoxCollider2D:矩形碰撞体,当两个碰撞体层级有碰撞且不为Trigger时,可以发生碰撞事件,勾选Is Trigger可以发生触发事件,Auto Tiling随精灵变化改变
  • Tilemap Renderer:瓦片地图,Order in Layer设置在指定层的渲染顺序
  • Tilemap Collider 2D:方便的为瓦片地图添加碰撞
  • Composite Collider 2D:整合碰撞体,减少计算
  • Animator:动画播放组件
  • Particle System:粒子系统
  • Audio Listener:接收声音
  • Audio Source:播放声音
  • 脚本:脚本名一定要和类名相同

脚本

  • 继承MonoBeHaviour表示这是一个组件类型的类,默认引用了挂载脚本的对象
  • Awake(void):被创建时调用
  • Start(void):仅执行一次,如果对象运行开始时处于活动状态,则在Awake->OnEnable后调用,运行后再激活则比OnEnable先执行
  • OnEnable(void):每次激活时都会调用
  • Update(void):每帧执行一次
  • FixedUpdate(void):以固定的时间间隔执行
  • Vector2:有x/y两个成员,一般用于表示位置/向量/宽高
  • transform
    transform.position;//Transform组件的位置信息
    transform.position.magnitude;//位置举离世界中心距离
  • Input
    Input.GetAxis(string);//返回玩家对指定控件操作的值
    Input.GetKeyDown(KeyCode);//接受指定键的按下指令
  • Debug
    Debug.Log(string);//在Console窗口输出string
  • QualitySettings

    QualitySettings.vSyncCount;//游戏刷新频率与显示器刷新频率垂直同步设置
  • Application

    Application.targetFrameRate;//帧率
  • Time

    Time.deltaTime;//实时帧渲染时间
  • GetComponent<Type>():获取组件引用

  • RigidBody2D

    RigidBody2D.MovePosition(Vector2);//移动到指定位置,发生碰撞则停止
    RigidBody2D.AddForce(direction * force);//根据方向和力使物体运动
    RigidBody2D.simulated;//物体系统模拟状态
  • Mathf

    Mathf.Clamp(int value, int min, int max);//返回value值,如果value超出范围,则范围最大/小范围值
    Mathf.Approximately(float, float);//屏蔽浮点存储的不精确判断两个值是否相等
  • OnTriggerEnter2D(Collider2D)//Collider与Trigger开始接触时执行

  • OnTriggerStay2D(Collider2D)//Collider与Trigger接触时执行

  • OnCollisionEnter2D(Collision2D)//Collision与Collision开始接触时执行

  • Animator

    Animator.SetFloat(string, float);//设置Parameters对应浮点数的值
    Animator.SetTrigger(string);//设置Parameters对应逻辑数的值

操作

操作顺序

  • 拖动素材里Art->Sprites文件下RubySheet文件生成的精灵RubyRunDown1到Scene窗口里,生成人物对象,为对象设置name:Ruby.
  • 在资源文件夹Assets下新建Scripts文件夹用于保存脚本,并创建新脚本RubyController,然后将脚本拖动到对象Ruby上.
  • 编写脚本,使用方向键盘控制Ruby的(Transform)坐标移动,使用Time.deltaTime保持不同帧率下的移动速度一致.
  • 在Hierarchy窗口为场景添加Tile Palette对象,编辑瓦片组件,先将地形素材切割成精灵,然后打开Tile Palette面板,新建Palette,将需要的精灵放入,然后使用绘制功能用瓦片填充地图
  • 使用Environment里的素材精灵生成一个对象,然后将对象拖入素材文件夹生成预制体,使用这些预制体装饰地图
  • 将瓦片地图的层级改为Default,值-10,然后在Edit>Project Setting>Graphics里将Transparency Sort Mode的值改为Custom Axis,让游戏以Y轴顺序渲染.
  • 修改角色和预制体的Sprite Sort Point属性为Pivot,并设置精灵的Pivot到脚部或根部,为角色和预制体添加合适形状的Collider 2D组件,并细调碰撞框,使碰撞看起来合理.为人物添加RigidBody 2D,设置重力为0,勾选Constraints下的Freeze Rotation.
  • 更改脚本RubyController里移动方法,使用RigidBody的Move方法,在固定帧率下物理计算完成后再移动位置,避免物理系统造成抖动.
  • 为Tilemap添加Tilemap Collider 2D组件,选中所有非水的瓦片,将Collider Type设置为None,然后再添加Composite Collider 2D组件,然后设置Tilemap Collider 2D组件的Used By Composite开关勾选上,将瓦片碰撞箱视为一个整体,并把自动添加的RigidBody 2D组件的的RigidBody Body Type属性设置为Static,减少物理运算.
  • 在RubyController脚本里添加maxHealth、currentHealth和speedX、Y属性,并将maxHealth、speed设置为public,这样以后更改最大生命值和速度就可以不用打开脚本直接在Unity的Inspector面板更改
  • 声明一个ChangeHealth函数,用于更改生命值并编写定义生命值变动触发的事件,使用Mathf.Clamp(action, min, max)确保生命值变化不会超出范围
  • 添加Canvas,再给Canvas添加Image子对象Health,并拖入UIHealthFrame的精灵,设置锚点为左上角,并为其添加Image子对象,精灵设置为CharacterPortrait并设置锚点为四角,再为Health添加一个子对象Mask,设置大小位置刚好覆盖完血条,并添加Image子对象,精灵设置为UIHealthBar,设置锚点和大小能刚好填充Mask,然后为Mask添加Mask组件,取消Show
  • 为Health添加脚本UIHealthBar,声明一个public Image并引用Mask,编写一个SetValue函数通过传入的血量比例来控制Mask的宽度
  • 编辑CollectibleHealth预制体和Damageable预制体,添加Collider组件并设置为Trigger,为Damageable设置平铺
  • 为两个预制体编写脚本,在碰撞事件检测到Ruby时调用RubyController脚本的ChangeHealth函数和UIHealthBar脚本的SetValue函数,CollectibleHealth要在进入碰撞阶段判断是否满血,然后回血并且自动销毁,Damageable要在保持碰撞阶段持续使Ruby扣血,但是要设置一个冷却时间,每隔多久触发一次
  • 编辑Robot预制体,添加RigidBody和Collider组件,模仿Ruby设置属性
  • 为Robot添加RobotController脚本,控制Robot按预定速度进行移动,模仿Damageable编写Ruby发生的碰撞事件触发Ruby的ChangeHealth,添加计时改变移动方向功能
  • 为Robot添加Animator组件,新建Controller文件Robot,并拖入Animator中调用,打开Animation窗口,利用MrClockworkSheet的精灵图集制作4个方向的行动动画,使用混合树控制动画的切换
  • 为Ruby添加Animator组件,并拖入素材中的Controller,编写Ruby和Robot的脚本,控制Animator的Parameters的值的改变
  • 使用CogBullet的精灵创建预制体,添加RigidBody和Collider组件,取消重力,设置碰撞框,设置层Character,为Ruby设置Player层,为瓦片地图设置Ground层,设置里取消Character层对Player和Ground层的碰撞
  • 为预制体CogBullet添加脚本,在Awake函数里设置定时销毁,定义Launch函数给RigidBody添加力,编写碰撞函数来销毁CogBullet和更改碰撞到的物体的状态
  • 编写Ruby脚本,接受键盘输入来触发发射齿轮事件,实例化CogBullet预制体并施加运动,添加Robot的Fixed动画,更改Robot脚本,添加Fixed属性用于被CogBullet碰撞时修改,当Fixed为True时转为Fixed动画并停用RigidBody
  • 下载Cinemachine包,新建虚拟摄像机,设置跟随Ruby,新建空对象添加Collider,设置碰撞范围为地图边界,并设置层Confiner,取消与其它层的碰撞,为虚拟摄像机添加CinemachineConfiner并使用刚才创建的碰撞体
  • 创建Particle System对象SmokeEffect并保存为预制体,设置相应的属性和精灵,使粒子达到理想效果,然后打开Robot预制体,添加子对象SmokeEffect,编写Robot脚本,定义public ParticleSystem变量引用SmokeEffect,并在Fixed事件执行其Stop方法
  • 使用Jambi的三个精灵自动生成动画并创建对象,存为预制体,添加Collider,设置NPC层,添加Canvas子对象创建对话框,添加Image子对象,设置UIDialogBox精灵,添加Text-TextMeshPro子对象,设置文本
  • 为Jambi编写NonPlayerCharacter脚本,编写启用子对象Canvas的方法,并在Start和Update中设置Canvas的取消启用功能,编写RubyController脚本,监听键盘按下"Q"事件,使用射线检测Jambi,并触发Canvas启用方法.
  • 将摄像机的Audio Listener移除,为摄像机添加子对象Listener,设置Position的Z值为10,并添加Audio Listener组件.创建一个空对象BackgroundMusic,添加Audio Source组件,引用2D MUSIC LOOP并勾选Loop选项,为Ruby和Robot添加Audio Source组件
  • 编辑Ruby,Robot和CollectibleHealth的脚本添加public AudioClip属性,并引用相应的音频,编写方法,在适当时机使Ruby和Robot播放相应音频
  • 在Player Setting里设置Build的文件夹位置,配置相关设置,然后Build
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值