用Unity做一个萌萌哒游戏(附资源)

这第一期是个考反应的游戏,看看效果图便能瞬间明白主要玩法:

首先需要准备游戏素材。对喜欢亲自动(zhe)手(teng)的我来说不是个事儿,我使用了PhotoShop+数位板自行绘制。没有数位板的同学只用PhotoShop也可以做到。

我绘制的素材和原版有些不同,具体如下:

所绘制素材文件
这里将咱亲手绘制的资源奉上:

网盘链接:https://pan.baidu.com/share/init?surl=f-crQYmgBbaRtO4CN_FqVA
提取码:1lq6

还是得说一句:请不要用于商业用途哦!

将准备好的游戏物体导入Unity引擎,下面开始正式游戏制作。

首先我们制作游戏菜单,也是游戏的第一个场景。

从预览图中应该能看出来:本游戏的一大特征,是活泼生动的动画效果。如果缺少这些效果那么游戏的魅力可以说是减少了一大半。

这些动画效果都是可以通过Unity的Animator实现的,这部分我用的都是2D图片精灵(Sprite),用UGUI也可以实现,这里需要分别需要两个动画状态机以及两个脚本:

第一个动画状态机:拼图表情动画状态机只需要添加一个默认的缩放动画即可,这样一来在游戏中该游戏物体就会一直自己缩放,不用我们操心(动画在Unity的动画窗口录制)。

GIF
拼图上的表情缩放动画录制
第二个动画状态机:当鼠标滑过屏幕中间的拼图时,会出现由小到大的气泡,这里也就需要一个气泡状态机,这里需要对气泡的图片做预先处理——我们有四个气泡,分别在气泡图片的Sprite Editor中设置图片的中心点到合适的位置。

气泡精灵锚点预设
这样一来同一个状态机可以给四个气泡重复使用,该状态机有两个状态,一个是默认状态一个是气泡放大的状态,分别是两个只有一帧的动画,这两个帧分别是Scale(0,0,0)和Scale(1,1,1),用一个bool类型的数值控制他们的状态转换,利用状态转换的自动补间动画实现我们需要的效果。

气泡精灵的录制动画
在表情游戏物体上添加一个控制鼠标滑过事件的脚本,当鼠标进入游戏物体时使气泡转为放大状态并修改游戏物体的贴图,否则气泡为默认状态,游戏贴图也是默认贴图。

    private void OnMouseEnter()

    {

        isTouch = true;

    }

    private void OnMouseExit()

    {

        isTouch = false;

    }

    private void BubbleMove()

    {

        if (isTouch)

        {

            myBubbleAnimator.SetBool("touch", true);

            gameObject.GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("Textures/PuzzleSB2");

        }

        else

        {

            myBubbleAnimator.SetBool("touch", false);

            gameObject.GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("Textures/PuzzleSB1");

        }

    }

菜单中的四个拼图的效果基本一致,但只有第一个拼图点击后会跳转到游戏场景。这里我将以上游戏物体复制了三份,并分别放置到正确的位置更改为对应的气泡图片,再另外新建了一个控制鼠标点击事件的脚本,触发场景跳转,同学们如果不喜欢,也可以重新写一个单独控制第一个表情的脚本。

到这里我们已经将一个看起来很酷的游戏菜单场景制作完毕。

接下来我们制作游戏中的第二个场景:游戏进行中的场景,由于游戏中有镜头抖动的效果,所以只能使用Sprite作为游戏物体。

场景中的其他图片不用多说,场景中的拼图分为左边的拼图和右边的拼图,左边叫玩家右边叫敌人好像不合适,就叫目标拼图吧。

玩家拼图的制作非常简单,只要添加控制根据按键切换赋值的脚本即可。

目标拼图是最好玩的,你以为我要用代码写拼图的运动和碰撞吗?不,录制一个从右往左的动画,在动画的最后一帧加入事件,该事件调用GameManager的碰撞触发方法就可以了,因为目的地的坐标不同,两个类型的目标拼图要分别录制动画。

GIF
目标拼图预制体制作
目标拼图有许多颜色,但是我又懒得画很多个颜色的各种拼图,看到这里你一定发现了目标拼图的预制体是一个灰色带阴影的图,通过实验我在这里用了两个图层(外图层是拼图的外框)通过对内图层的颜色更改实现不同颜色的目标拼图。

GIF

其实这也是我画的第一个素材,之后我哭着翻出了压箱底的数位板。


说到核心游戏物体就不得不说核心游戏玩法,整个游戏的核心玩法是用左右按钮(这里设置为A键和D键)改变玩家拼图的状态以接住屏幕右边移动到玩家拼图面前的目标拼图,如果接不到就游戏结束,本文主要是对游戏效果进行复现,并不对玩法进行改进。

那么问题是我们如何判断有没有接到。这个问题很简单,用一些数值类型枚举值就可以搞定,但是我选择用对象。


所以同学们这段如果理解不了可以不学,直接用枚举值就好,好奇为啥这样说的可以接着看一看。

这里画了个不太规范的类图来展示游戏中的脚本关系。


声明一个拼图类和三个不同拼图子类,这几个类不继承MonoBehaviour,每个子类中重写父类中的碰撞判断方法,该方法返回一个布尔值,通过与GameManager中的静态字段对比来返回结果,这里以左方向拼图为例:

public class LeftPuzzle : Puzzle

{

    public override bool PuzzleIsTure(Puzzle puzzle)

    {

        return puzzle == GameManager.Instance.rightPuzzle;

    }

}

另外三个脚本(玩家、目标拼图、GameManager)分别持有拼图对象,回忆上文,目标拼图的最后一帧会调用一个方法,也就是图中目标拼图持有的“动画帧触发”,该方法调用整个游戏逻辑中的核心方法——“拼图碰撞触发方法”

public void PuzzleTrig(GameObject gameObject)

    {

        Puzzle thePuzzle = gameObject.GetComponent<PuzzleMake>().puzzle;

        //回收go

        if (thePuzzle == leftPuzzle)

        {

            leftPuzzleList.Add(gameObject);

        }

        else if (thePuzzle == rightPuzzle)

        {

            rightPuzzleList.Add(gameObject);

        }

        //判断对错

        if (player.myPuzzle.PuzzleIsTure(thePuzzle))

        {

            AddScore();

            UpdateScoreText();

            winEffect.Play();

            SetPlayerFaceShow(false, true, false);

            scoreAnimator.SetTrigger("getscore");

        }

        else

        {

            StopAllCoroutines();

            SpacePuzzle(puzzleList);

            dieEffect.Play();

            SetPlayerFaceShow(false, false, true);

            gameOver.Play("GameOver");

        }

        StartCoroutine(CameraShake());

    }

用GameManager脚本管理整个游戏的主要逻辑,将这个脚本设置为单例模式,

public class GameManager : MonoBehaviour{

    public static GameManager Instance;

    private void Awake()

    {

        Instance = this;

    }}

并声明三个拼图对象作为整个游戏所有拼图所持有的对象,这三个对象分别是默认拼图、左拼图和右拼图(默认拼图很寂寞,因为只有一个拼图要他),当拼图碰撞时只要调用玩家拼图持有的拼图对象的碰撞判断方法即可。

后面写拼图预制体的时候就遇到问题了,两个预制体必须分别写脚本,因为使用的是对象来标识拼图,不能在Inspector面板中分别设置值(如果是数值就很简单了),但问题不大,多写两个脚本就好了,这样避免了很多if判断,比较舒服。

---------------------------------------不想看的同学跳到这里-----------------------------------------

接下来我们来制作游戏中的动态效果,看图分析,游戏中的动画有玩家拼图上的表情动画和左下角的得分上的动画以及游戏结束的破碎动画,除此之外还有两个粒子特效,加上每一次拼图碰撞伴随着的镜头抖动,都是很简单的东西,组合起来有不简单的效果。

1、动画

原版是用眼睛放大缩小的状态变化来表现方块“未碰撞”“碰到对的”“碰到错的”这三个状态,用Animator可以简单搞定,为什么要特地提一嘴?因为我给自己挖了个坑。

我画了三个表情。并且,第一个表情的眼睛是分两张图的,第二个表情眼睛是要放大的,第三个表情是可以不动的,我尝试使用Animator管理他们,得到了一个鬼畜的方块,然后我一拍大腿,写了一个方法搞定了。

我设计的表情素材


用显示隐藏游戏物体进行玩家的表情状态变换


所有表情的动画默认播放就行。我真佩服我自己。

这个游戏物体是整个场景目前唯一使用到UGUI的地方,并且使用的是Unity新加入的TextMeshPro-Text,这里使用的是默认字体,感兴趣的同学可以自行深入了解。

之所以在这里使用新组件主要原因当然也是因为动画,该组件支持许多原版Text没有的操作,比如“自动匹配大小”就是当前需要使用的功能,将“AutoSize”勾选并将字体最大值设置到足够大,这样一来录制动画就非常容易了。

该物体有两个状态,默认状态是普通的放大缩小动画,得分时的动画比较特别,这里用图片展示。需要注意这里动图里面有个错误就是没有设置中心点,导致动画记录了中心点移动,这也是开始菜单的气泡动画强调的注意点,而我等到游戏做完写文章的时候才注意到。

细心的同学还会发现,游戏中的字体是有投影的,这个用新版组件是否能够做到呢?其实和组件没什么关系,复制一份Text调整颜色和位置,让他们双宿双飞共同进退就好了。

GIF

GIF

当拼图碰在一起时玩家按了错误的按键(或者没有按按键),这时候需要播放死亡动画,该动画通过调节图片的透明度和颜色完成,这里我用了UGUI的Image,理论上用Sprite应该也能实现,聪明的同学一定能自己做出来。

2、粒子特效

图包里有对应的贴图,拖拽到粒子的TextureSheetAnimation上,Shape设置为Circle,然后调整其他数值把两个粒子特效做出来就行了,这里我也没法说,毕竟我都是试出来的。

3、镜头抖动

在GameManager写一个控制镜头抖动的协程,在碰撞触发方法调用他就是了,要什么自行车,没什么好说的。

public IEnumerator CameraShake()

{

   Vector3 OrigPosition = shakeCameraTransform.localPosition;

   float ElapsedTime = 0.0f;

   while (ElapsedTime < shakeTime)

    {

       Vector3 RandomPoint = OrigPosition + Random.insideUnitSphere * shakeAmount;

       shakeCameraTransform.localPosition = Vector3.Lerp(shakeCameraTransform.localPosition, RandomPoint,

 Time.deltaTime * shakeSpeed);

       yield return null;

       ElapsedTime += Time.deltaTime;

   }

   shakeCameraTransform.localPosition = OrigPosition;

}

每一个动画和特效都非常的简单,但是综合起来却能让人觉得效果特别炫,这正是这个游戏真正值得我们学习的地方。原游戏还有音效加持,效果更好,美术上的加持也是必不可少的。

最后简单制作游戏的结束场景,这个场景里的游戏物体全都是UGUI,最终成绩的显示动画和上一个场景的动画类似,由于Game Manager是单例模式,所以存储在该脚本的“得分”在游戏结束的场景中也能被调用哦~

新的东西是按钮动画效果——新建按钮之后将组件的“Transition”设置为“Animation”,再点击“AutoGenerateAnimation”,这样Unity会自动帮你生成该按钮的状态机,再在对应的状态中录制两个不同的动画(默认和鼠标悬停两个状态有不同动画),就可以完成了。

Ctrl+D复制上文制作按钮,换个贴图再各自放到合适的位置,哦嚯!场景搭建完毕!游戏做完了?不!我们还要把三个场景连接起来,在对应的地方写上场景跳转:SceneManager.LoadScene("目标场景名称")。

但是场景跳转的时候,似乎只是屏幕一黑,没有可爱的拼图开合动画啊,这个动画当然也是要自己做呀。

当我们做好了一个过渡动画之后又会发现,在不同的场景中,过渡动画结束后要做的事情都有些微的不同,那么我们要每个场景都写一个脚本,做三套动画的游戏物体吗?当然不!这时候就是委托大展身手的时候啦。

public delegate void SceneEvent();

    public SceneEvent SceneOpenEvent;

    public SceneEvent SceneCloseEvent;

    public void CloseGo()

    {

        SceneCloseEvent?.Invoke();

    }

    public void OpenGo()

    {

        SceneOpenEvent?.Invoke();

    }

这样一来这个游戏就真正完成啦,是不是简单而不枯燥,感觉自己又变强了呢~

下面开始技术总结(敲黑板)

第一、镜头有抖动的场景背景图要画大一点。

第二、动画的帧数只要12帧就可以流畅播放,但是部分动画效果会不好,这里设置的不太好。

第三、用动画帧事件实现跳转前播放动画比用协程实现更灵活方便,但是如果状态机过渡动画没有走到设置事件的帧就会不触发。

第四、得分动画本来是想在游戏进行场景做预制体在游戏结束场景中复用的,但是问题很大,重新做了,说明在制作原型的时候考虑的不到位。

第五、原游戏场景跳转做了异步跳转,但是我没有。

该游戏源码已上传到Github,总结完毕:https://github.com/peiyl/Puzzling 

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Unity游戏修改工具是一种用于修改Unity游戏的工具,它可以提供一系列功能来改变游戏的行为、外观和性能。这些修改工具可以帮助开发者创建自定义的游戏玩法、调整游戏参数、添加新的游戏元素等。 Unity游戏修改工具通常包括以下主要功能: 1. 脚本修改:这种工具可以允许开发者修改游戏中的脚本代码,以实现自定义的行为。通过修改脚本代码,开发者可以修改游戏的逻辑、添加新的功能、调整游戏的难度等。 2. 资源修改:这种工具可以让开发者修改游戏中的资源文件,如图像、音频、视频等。通过修改资源文件,开发者可以改变游戏的外观和听觉效果,使游戏更具个性化。 3. 参数修改:这种工具可以让开发者修改游戏中的参数数值,如血量、攻击力、移动速度等。通过修改参数,开发者可以调整游戏的平衡性,使游戏更具挑战性或者更容易。 4. 场景修改:这种工具可以让开发者修改游戏中的场景,如增加、删除或修改场景中的物体和环境。通过修改场景,开发者可以创建自定义的关卡和游戏世界,增加游戏的玩法和趣味性。 总之,Unity游戏修改工具为开发者提供了更多的自由度,使他们能够根据个人需求和想法改变游戏。这些工具可以帮助开发者快速迭代和调试游戏,并且可以激发创造力,打造独特而引人注目的游戏体验。 ### 回答2: Unity(统一游戏引擎)是一款广泛使用的游戏开发引擎。它提供了丰富的工具和功能,使开发者可以轻松创建各种类型的游戏。然而,在开发过程中,可能需要对游戏进行修改,以适应不同的需求或改进游戏体验。为此,出现了一些专门用于修改Unity游戏的工具。 Unity游戏修改工具主要用于修改Unity游戏中的各种元素,包括场景、人物角色、道具、特效等。它们提供了简单易用的界面和功能,使开发者可以轻松地进行游戏修改,而不需要深入了解Unity的底层技术。 这些工具通常具有以下特点: 1. 可视化界面:这些工具提供了直观的界面,使开发者可以通过拖拽和调整参数来修改游戏元素。这种可视化的方式,使得修改变得简单、快捷。 2. 多功能支持:这些工具通常支持多种功能,例如修改场景中的物体位置、大小、旋转等,修改人物角色的外观、能力,以及添加、删除或修改各种游戏元素。 3. 实时预览:工具在修改过程中通常会提供实时预览功能,使开发者可以即时看到修改后的效果。这种实时预览的功能,能够帮助开发者更好地调整修改时的参数。 4. 无需编程:大多数修改工具提供了不需要编程的方式来进行游戏修改。这使得那些不具备编程技能的开发者也能够参与到游戏的修改和改进中。 总之,Unity游戏修改工具为开发者提供了简便的方式来修改和改进Unity游戏。它们不仅节省了开发时间和精力,还使得非专业开发者也能够参与到游戏修改中,促进了游戏开发的创作和创新。 ### 回答3: Unity游戏修改工具是一种能够用于修改Unity游戏的软件工具。它能够提供给开发者们修改游戏中各种元素的能力,包括游戏环境、角色设定、道具属性、游戏难度等等。这些修改工具通常包含一系列功能强大的编辑器,使得开发者可以对游戏进行完全的定制和调整。 Unity游戏修改工具的主要功能包括场景编辑器、资源编辑器和脚本编辑器。场景编辑器用于创建、编辑和布置游戏的场景,包括地形、建筑、天气效果等等。资源编辑器可以帮助开发者对游戏中的资源进行修改和替换,比如修改角色模型、纹理贴图等。脚本编辑器是用于编写和修改游戏中的脚本代码,使得开发者可以自定义游戏的逻辑和功能。 Unity游戏修改工具的优点是灵活性和易用性。通过使用这些工具,开发者可以快速地对游戏进行修改,调整和优化,节约了大量的开发时间。同时,Unity游戏修改工具的界面通常设计得简洁易懂,使得开发者可以轻松上手并且能够快速了解和使用各种功能。此外,Unity游戏修改工具还支持多平台发布,可以在不同的设备上进行修改和测试。 总的来说,Unity游戏修改工具是一种强大而灵活的软件工具,能够帮助开发者们进行游戏的定制和调整。通过使用这些工具,开发者可以创造出独特且精彩的游戏体验,满足玩家的不同需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值