如何制作一个Unity2D闯关游戏(五)

如何制作一个Unity2D闯关游戏(五)

回顾

在上一篇的教程里我们给Player添加了手机动画和受击反馈,以及添加了KillPlane来防止玩家调出世界,然后又加入了的重生点系统以及Gem和Cherry,增添了游戏的可玩性。

开始第五天的制作

上一篇我们增加了玩家的受伤反馈,但是一般的闯关游戏还会再添加一个无敌时间来保证玩家的游戏性。

添加无敌时间

我们打开 PlayerHealthController 脚本,我们无敌时间的功能在这里面来添加新的代码。

首先我们先添加两行定义,分别是无敌时间以及计数器,还需要一个SpriteRenderer,通过修改透明度来表示是否处于无敌状态。

private readonly float invincibleTime =0.5f;//无敌时间
private float invincibleCounter;//无敌时间计数器
private SpriteRenderer spriteRenderer;

然后我们需要再 DealDamage 函数里把无敌时间赋值给计数器。

public void DealDamage(int damage)
{
    if(invincibleCounter<=0)
    {
        //原先代码
        
        
        //如果血量为零了则不需要无敌时间
        if (currentHealth <= 0)
        {
            //原先代码
            
        }
        else//如果血量不为零,则需要添加无敌时间
        {
            //给予无敌时间
            invincibleCounter = invincibleTime;
            
            //让玩家的透明度为50%来表示无敌状态
            var color = spriteRenderer.color;
            spriteRenderer.color = new Color(color.r, color.g, color.b, 0.5f);
            
            //受伤了调用反馈
            PlayerController.instance.KnockBack();
        }
    }
}

然后计数器部分的代码在Update函数里面。

private void Update()
{
    //无敌时间
    if (invincibleCounter >= 0)
    {
        invincibleCounter -= Time.deltaTime;
        
        //如果无敌时间为零,取消半透明
        if (invincibleCounter <= 0)
        {
            var color = spriteRenderer.color;
            spriteRenderer.color = new Color(color.r, color.g, color.b, 1f);
        }
    }
}

添加拾取特效

在资源包 "\2D Platformer Assets\Graphics\Collectibles" 路径下找到 Collect_Effect 素材。然后按照之前的之前的方法创建拾取特效。

我们在最后两帧将SpriteRenderer取消勾选。

添加死亡特效

素材路径以及设置方法同上。

创建特效消失脚本

我们创建一个名为 DestoryOverTime 的脚本,将其挂载在两个特效上。

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DestroyOverTime : MonoBehaviour
{
    //存在时间
    public  float lifeTime;

    private void Update()
    {
        Destroy(gameObject,lifeTime);
    }
}

将拾取特效的lifetime设置为0.5,死亡特效的lifetime设置为0.75,设置完之后把两个特效制成预设体。

在游戏中添加特效

接下来我们先去到 Pickup 脚本里,添加生成特效脚本。

//获取特效预设体
public GameObject effects;

private void OnTriggerEnter2D(Collider2D other)
{
    if (!other.CompareTag("Player")) return;
    if (isGem)
    {
        //原先代码
        
        Instantiate(effects, transform.position, transform.rotation);

        Destroy(gameObject);
    }
    else if (isHeal && PlayerHealthController.instance.currentHealth!=PlayerHealthController.instance.maxHealth)
    {
       //原先代码
        
        Instantiate(effects, transform.position, transform.rotation);

        Destroy(gameObject);
    }
}

然后再 PlayerHealthController 脚本的 DealDamage 函数里,在玩家死亡部分添加生成特效代码。

//获取死亡特效预设体
public GameObject deathEffect;

//生成代码
Instantiate(deathEffect, transform.position, transform.rotation);

添加敌人

我们在素材中找到敌人Frog,首先我们需要一个空物体作为父物体,然后将Frog放在空物体下,将空物体命名为 FrogEnemy,添加 Rigidbody 2D 和 Box Collier 2D 组件。

然后继续按照之前的方法设置动画,动画组件是在FrogEnemy上,图像是其子物体。

这个动画应该有一定的间隔,所以我们在最后让他保持原状一定时间。

接下来给FrogSprite添加一个 Box Collier 2D,设置碰撞体大小。

然后调整碰撞体和图像位置一致。

Animator 窗口中添加一个bool类型的 isMoving

接着我们创建两个空物体,分别作为Frog移动的两个端点,设置好位置之后将这两个空物体放入FrogEnemy下。

以上为两个物体上的组件。

编写敌人移动脚本

在制作完敌人模型之后,接下来就是添加敌人的移动逻辑。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyController : MonoBehaviour
{
    public float moveSpeed;//敌人移动速度
    public Transform leftPoint, rightPoint;//左右端点的位置
    private bool movingRight=true;

    private Rigidbody2D rbody;
    private Animator anim;
    private SpriteRenderer spriteRenderer;
    private static readonly int IsMoving = Animator.StringToHash("isMoving");

    public float moveTime, waitTime;//给敌人设定移动时间和暂停时间
    private float moveCount, waitCount;//移动暂停计数器
    

    void Start()
    {
        rbody = GetComponent<Rigidbody2D>();
        spriteRenderer = transform.GetChild(0).gameObject.GetComponent<SpriteRenderer>();
        anim = GetComponent<Animator>();

        //将作为位置放到世界中
        leftPoint.parent = null;
        rightPoint.parent = null;
        //因为移动是父物体移动,所以需要把端点放到世界中
        
        moveCount = moveTime;
    }

    
    void Update()
    {
        //青蛙左右移动
        if(moveCount>0) //移动
        {
            anim.SetBool(IsMoving,true);
            moveCount -= Time.deltaTime;
            
            //向右移动
            if (movingRight)
            {
                rbody.velocity = new Vector2(moveSpeed, rbody.velocity.y);

                if (transform.position.x > rightPoint.position.x)
                {
                    movingRight = false;
                    spriteRenderer.flipX = false;
                }
            }
            else//向左移动
            {
                rbody.velocity = new Vector2(-moveSpeed, rbody.velocity.y);

                if (transform.position.x < leftPoint.transform.position.x)
                {
                    movingRight = true;
                    spriteRenderer.flipX = true;
                }
            }

            if (moveCount <= 0)
            {
                waitCount =Random.Range(waitTime*0.75f,waitTime*1.25f) ;
            }
            
            
        }
        else if(waitCount>0)//暂停
        {
            anim.SetBool(IsMoving,false);
            waitCount -= Time.deltaTime;
            rbody.velocity = new Vector2(0f, rbody.velocity.y);

            if (waitCount <= 0)
            {
                moveCount =Random.Range(moveTime*0.75f,moveTime*1.25f) ;
            }
            
        }
        
    }
}

最后给FrogEnemy挂载DamagePlayer脚本,使Frog具有对玩家造成伤害的功能。

总结

本篇完善了角色的受伤是的一些反馈内容,增加了游戏特效,新增了新的敌人,增加了游戏的可玩性。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,718评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,683评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,207评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,755评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,862评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,050评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,136评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,882评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,330评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,651评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,789评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,477评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,135评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,864评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,099评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,598评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,697评论 2 351

推荐阅读更多精彩内容