Unity Sunny Land开发流程(三)

2023-10-08 05:59
文章标签 流程 开发 unity sunny land

本文主要是介绍Unity Sunny Land开发流程(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 0.开发流程一、二
  • 1.视觉差Parallax
  • 2.主菜单MainMenu
  • 3.暂停菜单&AudioMixer&滑动条控制音量
  • 4.手机控制|触控操作|真机测试
  • 5.单向平台
  • 6.移动手感&多段跳
  • 7.音效管理SoundManager(Static)
  • 8.End 游戏生成Build

0.开发流程一、二

  开发流程一:https://blog.csdn.net/xiji333/article/details/109621328
  开发流程二:https://blog.csdn.net/xiji333/article/details/109955327

1.视觉差Parallax

  这一节是为了让你的 2 D 2D 2D平板看起来更有层次感,简单来说就是让背景或者其它的物体以不同于摄像机的速率移动。想要实现这个效果的可以去看视频。

2.主菜单MainMenu

  这一节我们来制作主菜单。涉及到 U I UI UI p a n e l 、 b u t t o n panel、button panelbutton,以及动画效果。
在这里插入图片描述
  可以设置 b u t t o n button button的各种属性,比如默认颜色,高亮颜色,点击时的颜色,不可用时的颜色等等:
在这里插入图片描述
   T e x t M e s h P r o TextMeshPro TextMeshPro文本也可以设置很多属性,比如字体、阴影、颜色(可以设置渐变色)、外发光等等:
在这里插入图片描述
  接下来就是给按钮添加监听了:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;public class MainMenu : MonoBehaviour
{public void Play(){SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);}public void Quit(){
#if UNITY_EDITORUnityEditor.EditorApplication.isPlaying = false;
#elseApplication.Quit();
#endif}
}

  把它挂在到 p a n e l panel panel上,然后给按钮增加监听:
在这里插入图片描述
  然后就可以啦,注意一定不要删除 E v e n t S y s t e m EventSystem EventSystem这个对象。

3.暂停菜单&AudioMixer&滑动条控制音量

  这一节我们将制作一个暂停菜单,虽然比较丑不过主要是为了学一下怎么通过它来控制我们游戏的声音:
在这里插入图片描述

在这里插入图片描述
  把下面的代码挂到 P a u s e P a n e l PausePanel PausePanel上,并设置两个按钮的监听:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PausePanel : MonoBehaviour
{public void Pause(){gameObject.SetActive(true);//慢动作或者加速也可以通过设置这个参数实现!Time.timeScale = 0f;}public void Continue(){gameObject.SetActive(false);Time.timeScale = 1f;}
}

  接下来是关于 A u d i o M i x e r Audio\ Mixer Audio Mixer的介绍。首先自己创建一个 A u d i o M i x e r Audio\ Mixer Audio Mixer,并从菜单打开相关的窗口:
在这里插入图片描述

在这里插入图片描述
   A u d i o M i x e r Audio\ Mixer Audio Mixer可以混合调节多个 A u d i o S o u r c e Audio\ Source Audio Source,只需要修改它的 O u t p u t Output Output
在这里插入图片描述
  你对 A u d i o M i x e r Audio\ Mixer Audio Mixer的设置(音量、音效等等)会影响所有关联到它的 A u d i o S o u r c e Audio\ Source Audio Source的最终播放效果:
在这里插入图片描述
  那么我把滑条的范围设置到 [ − 80 , 20 ] [-80,20] [80,20],再把当前滑条对应的值设置到这里就可以控制音量的大小了。注意 A u d i o M i x e r Audio\ Mixer Audio Mixer是没有办法直接挂载脚本的,我们需要把它的某些属性公开出去(即可以通过代码中的 A u d i o M i x e r Audio\ Mixer Audio Mixer对象访问),首先点击想要公开出去的属性:
在这里插入图片描述
  右键选择:
在这里插入图片描述
  在这里可以看到公开出来的属性,还可以修改名字:
在这里插入图片描述
在这里插入图片描述
  现在来修改代码吧:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;public class PausePanel : MonoBehaviour
{public AudioMixer mainAudioMixer;public void Pause(){gameObject.SetActive(true);//慢动作或者加速也可以通过设置这个参数实现!Time.timeScale = 0f;}public void Continue(){gameObject.SetActive(false);Time.timeScale = 1f;}public void SetVolume(float value){//注意这里的第一个参数要和公开出来的属性的名称一致mainAudioMixer.SetFloat("MainVolume", value);}
}

  设置滑动条的监听:
在这里插入图片描述
在这里插入图片描述
  注意此处不要选择下面的那个同名函数,那个只能设置一个值,上面这个是跟随滑动条动态设置的。
在这里插入图片描述
  接下来我们再增加一个滑动条,用来控制人物跳跃、受伤、攻击、敌人爆炸的音效的大小:
在这里插入图片描述
  新增一个 E f f e c t Effect Effect分组,并设置相关音源的输出、滑动条监听等:
在这里插入图片描述

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;public class PausePanel : MonoBehaviour
{public AudioMixer mainAudioMixer;public void Pause(){gameObject.SetActive(true);//慢动作或者加速也可以通过设置这个参数实现!Time.timeScale = 0f;}public void Continue(){gameObject.SetActive(false);Time.timeScale = 1f;}public void SetMainVolume(float value){//注意这里的第一个参数要和公开出来的属性的名称一致mainAudioMixer.SetFloat("MainVolume", value);}public void SetEffectVolume(float value){mainAudioMixer.SetFloat("EffectVolume", value);}}

在这里插入图片描述
  游玩游戏后你会发现,第二个滑动条只影响分组中与 E f f e c t Effect Effect相关的音源,第一个滑动条不仅影响与 M a s t e r Master Master相关的,还影响与 E f f e c t Effect Effect相关的。那么我们可以得出一个结论,一个分组中的主 M i x e r Mixer Mixer影响其余所有 M i x e r Mixer Mixer
在这里插入图片描述

4.手机控制|触控操作|真机测试

  看视频吧:https://www.bilibili.com/video/BV1GJ411u75o?p=2。

5.单向平台

  如图所示,他目前是一个普通的平台,即玩家从下面不能直接跳上去:
在这里插入图片描述

在这里插入图片描述
  给它添加一个 P l a t f o r m E f f e c t o r 2 D Platform\ Effector\ 2D Platform Effector 2D组件,同时勾选碰撞体的 U s e d B y E f f e c t o r Used\ By\ Effector Used By Effector
在这里插入图片描述
在这里插入图片描述
  现在人物就可以从下面直接跳上来了。

6.移动手感&多段跳

   F i x e d U p d a t e FixedUpdate FixedUpdate的时间间隔是固定的, U p d a t e Update Update的时间间隔是不固定的。当你用代码监听用户的按键( G e t B u t t o n 、 G e t K e y GetButton、GetKey GetButtonGetKey),且希望得到一个实时的反馈时,你需要使用 U p d a t e Update Update;所有跟物理有关的东西应该放到 F i x e d U p d a t e FixedUpdate FixedUpdate中。
在这里插入图片描述
  由于跳跃和下蹲都是需要实时响应的,所以我们把这部分的代码放到 U p d a t e Update Update中,而移动一般来说都是需要用户持续按下方向键的,我们可以把这部分代码放到 F i x e d U p d a t e FixedUpdate FixedUpdate中。下面的代码实现了二段跳,我自己感觉手感还是可以的,注意要把 r i g i d b o d y rigidbody rigidbody中的重力系数调到 2 2 2。不过下面的代码也不是很完美,依然还有很多需要打磨的地方,比如动画状态机中 F a l l Fall Fall H u r t Hurt Hurt的切换,蹲下的时候不能跳跃,跳跃的时候不能蹲下之类的。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerController : MonoBehaviour
{private Rigidbody2D rb2d;private Animator animator;private BoxCollider2D boxCollider2D;[SerializeField]private int cherry = 0;[SerializeField]private int jumpCount = 2;[SerializeField]private bool isHurt = false;private Vector2 initBoxCollider2DOffset;private Vector2 initBoxCollider2DSize;private Vector2 crouchBoxCollider2DOffset = new Vector2(0, -0.57f);private Vector2 crouchBoxCollider2DSize = new Vector2(0.92f, 0.85f);public Text cherryText;public float speed = 5f;public float jumpForce = 8f;public LayerMask ground;public AudioSource jumpAudio;public AudioSource hurtAudio;public AudioSource pickCherryAudio;// Start is called before the first frame updatevoid Start(){rb2d = GetComponent<Rigidbody2D>();animator = GetComponent<Animator>();boxCollider2D = GetComponent<BoxCollider2D>();initBoxCollider2DOffset = boxCollider2D.offset;initBoxCollider2DSize = boxCollider2D.size;}// Update is called once per framevoid Update(){Jump();Crouch();SwitchAnimation();}private void FixedUpdate(){if (!isHurt)//非受伤状态{Movement();}}void Jump(){if (boxCollider2D.IsTouchingLayers(ground) && !animator.GetBool("jumping"))jumpCount = 2;if (Input.GetButtonDown("Jump") && jumpCount > 0){rb2d.velocity = new Vector2(rb2d.velocity.x, jumpForce);animator.SetBool("jumping", true);jumpAudio.Play();--jumpCount;}}void Movement(){float horizontalMove = Input.GetAxis("Horizontal");int faceDirection = (int)Input.GetAxisRaw("Horizontal");rb2d.velocity = new Vector2(faceDirection * speed, rb2d.velocity.y);animator.SetFloat("running", Mathf.Abs(horizontalMove));if (faceDirection != 0){transform.localScale = new Vector3(faceDirection, 1, 1);}}void Crouch(){//头顶上没有障碍物if (!Physics2D.OverlapCircle(transform.position, 0.4f, ground)){//持续按下if (Input.GetButton("Crouch")){animator.SetBool("crouching", true);boxCollider2D.offset = crouchBoxCollider2DOffset;boxCollider2D.size = crouchBoxCollider2DSize;}else{animator.SetBool("crouching", false);boxCollider2D.offset = initBoxCollider2DOffset;boxCollider2D.size = initBoxCollider2DSize;}}}void SwitchAnimation(){if (rb2d.velocity.y < 0 && !boxCollider2D.IsTouchingLayers(ground)) //y轴速度<0且没有接触到地面时{animator.SetBool("falling", true);}if (animator.GetBool("jumping")) //跳跃状态{if (rb2d.velocity.y < 0){animator.SetBool("jumping", false);animator.SetBool("falling", true);}}else if (animator.GetBool("falling")) //下落状态{if (boxCollider2D.IsTouchingLayers(ground)){animator.SetBool("falling", false);}}else if (isHurt) //受伤状态{animator.SetBool("hurt", true);int sign = rb2d.velocity.x < 0 ? -1 : 1;rb2d.velocity += new Vector2(speed * Time.deltaTime, 0f) * -sign;if (Mathf.Abs(rb2d.velocity.x) < 0.1f){isHurt = false;animator.SetBool("hurt", false);}}}

7.音效管理SoundManager(Static)

  其实就是创建了一个单例类用来管理场景中的声音,想学的可以看视频学习。我觉得它的不足之处就是同一时间只能播放一个 c l i p clip clip,所以就不写啦。

8.End 游戏生成Build

在这里插入图片描述
在这里插入图片描述
  完结撒花~

这篇关于Unity Sunny Land开发流程(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/163185

相关文章

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒

Ubuntu向多台主机批量传输文件的流程步骤

《Ubuntu向多台主机批量传输文件的流程步骤》:本文主要介绍在Ubuntu中批量传输文件到多台主机的方法,需确保主机互通、用户名密码统一及端口开放,通过安装sshpass工具,准备包含目标主机信... 目录Ubuntu 向多台主机批量传输文件1.安装 sshpass2.准备主机列表文件3.创建一个批处理脚

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

一个Java的main方法在JVM中的执行流程示例详解

《一个Java的main方法在JVM中的执行流程示例详解》main方法是Java程序的入口点,程序从这里开始执行,:本文主要介绍一个Java的main方法在JVM中执行流程的相关资料,文中通过代码... 目录第一阶段:加载 (Loading)第二阶段:链接 (Linking)第三阶段:初始化 (Initia

基于Go语言开发一个 IP 归属地查询接口工具

《基于Go语言开发一个IP归属地查询接口工具》在日常开发中,IP地址归属地查询是一个常见需求,本文将带大家使用Go语言快速开发一个IP归属地查询接口服务,有需要的小伙伴可以了解下... 目录功能目标技术栈项目结构核心代码(main.go)使用方法扩展功能总结在日常开发中,IP 地址归属地查询是一个常见需求:

Git打标签从本地创建到远端推送的详细流程

《Git打标签从本地创建到远端推送的详细流程》在软件开发中,Git标签(Tag)是为发布版本、标记里程碑量身定制的“快照锚点”,它能永久记录项目历史中的关键节点,然而,仅创建本地标签往往不够,如何将其... 目录一、标签的两种“形态”二、本地创建与查看1. 打附注标http://www.chinasem.cn