您当前的位置: 首页 >  flashinggg unity

【Unity入门计划】制作RubyAdventure03-使用碰撞体&触发器实现世界交互

flashinggg 发布时间:2022-08-09 12:53:03 ,浏览量:1

目录

 8 添加生命系统

演示效果

9 使用触发器实现吃血包

9.1 添加一个可以被吃掉的血包

10 使用触发器添加伤害区域

10.1 设置伤害区域

10.2 设置无敌时间

关于无敌时间的讨论

10.3 平铺伤害区域/平铺精灵

1 精灵渲染器Draw Mode -> Tiled

2 精灵素材中Mesh Type -> Full Rect

3 2D碰撞体组件 -> 勾选Auto Tilling

11 添加敌人

11.1 敌人来回移动

11.2 敌人伤害

Collision2D 2D碰撞类

学习的教程

【unity2021入门教程】68-2D游戏开发教程系列-03-RubyAdventure2DRpg官方教程-16-完善触发器代码_哔哩哔哩_bilibili

已进行步骤

【Unity入门计划】制作RubyAdventure01-玩家的创建&移动_flashinggg的博客-CSDN博客

【Unity入门计划】制作RubyAdventure02-处理瓦片地图&碰撞_flashinggg的博客-CSDN博客

 8 添加生命系统

先在之前的Ruby Controller脚本中,加上一个简单的生命上限&规定初始生命值

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

public class RubyController : MonoBehaviour
{

    //设置最大生命值(生命上限)
    public int maxHealth = 5;
    //当前生命值,默认为0
    private int currentHealth;
    private void Start()
    {
        //初始化当前生命值
        currentHealth = maxHealth;
    }
    // 每帧都会执行一次Update函数
    void Update()
    {
        ...
    }
    //控制速度,比update快一点
    void FixedUpdate()
    {
        ChangeHealth(1);
    }

    //更改生命值
    //amount是游戏中加血/减血的操作
    void ChangeHealth(int amount)
    {
        //限制当前生命值范围为[0,maxHealth]
        currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
        //输出
        Debug.Log("当前生命值为:" + currentHealth + "/" + maxHealth);
    }
}
演示效果

9 使用触发器实现吃血包

之前写过一个触发器的简单博客:【Unity入门计划】基本概念(2)-触发器 Trigger_flashinggg的博客-CSDN博客

它是一个特殊的碰撞体,只检测碰撞,不阻止移动。

9.1 添加一个可以被吃掉的血包

关于数据保护内容,我另开了一个博客进行简单的记录介绍:【Unity入门计划】Unity实例-C#如何通过封装实现对数据成员的保护

先从Project中加入一个可以充当血包的精灵,同时创建一个预制件,给他一个2D碰撞体并设置为触发器。

挂一个检测触发并进行相应设置的脚本:

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

public class HealthCollectible : MonoBehaviour
{
    //设置每次碰撞加的血量
    public int amount = 1;
    private int CollideTimes;
    //添加触发器事件,每次碰撞触发器时执行其中的代码
    private void OnTriggerEnter2D(Collider2D other)
    {
        CollideTimes++;
        Debug.Log($"和当前物体发生碰撞的是:{other},当前是第{CollideTimes}次发生碰撞!");

        //获取Ruby对象的脚本组件,还是用GetComponent方法
        RubyController rubyController=other.GetComponent();
        if(rubyController != null)
        {
            //血量+1
            if (rubyController.health0加血,则不进入无敌时间
        {
            if (isInvincible)//当前处于无敌状态,则不减血
            {
                return;//直接中段当前方法
            }
            //不是无敌状态,接下来会减血,因此提前改成true
            isInvincible = true;
            //重置计时器
            invincibleTimer = timeInvincible;
        }

        //限制当前生命值范围为[0,maxHealth]
        currentHealth = Mathf.Clamp(currentHealth + amount, 0, maxHealth);
        //输出
        Debug.Log("当前生命值为:" + currentHealth + "/" + maxHealth);
    }


}
10.3 平铺伤害区域/平铺精灵

有时候需要平铺伤害区域,Unity自带有平铺精灵的功能。

1 精灵渲染器Draw Mode -> Tiled

还记得精灵渲染器里的Draw Mode,默认是Simple,选择Tiled

2 精灵素材中Mesh Type -> Full Rect

在对应的精灵素材属性中,Mesh Type选择Full Rect

再进入Scene中调整当前游戏对象,T键框选,发现可以实现平铺了。

还需要将碰撞体也平铺对应

3 2D碰撞体组件 -> 勾选Auto Tilling

此时就完成了伤害区域平铺的操作了。

11 添加敌人

首先需要在官网下载敌人Robot的图片。

世界交互 - 伤害区域和敌人 - Unity Learn

同样的操作,再Unity中把他变成精灵,挂上Order的脚本。

11.1 敌人来回移动

关于来回移动代码的编写,可以看看我的这篇博客:【Unity入门计划】2D游戏实现敌人来回移动控制脚本

11.2 敌人伤害

 这里想要实现Ruby碰撞敌人后,掉血的操作。由于需要真实的碰撞感,因此不能使用之前的OnTriggerEnter,而是采取碰撞检测。

    //碰撞检测
    //添加敌人伤害的逻辑
    private void OnCollisionEnter2D(Collision2D other)
    {
        //获取和当前collision碰撞的对象的脚本组件
        RubyController player = other.gameObject.GetComponent();
        if (player != null)
        {
            player.ChangeHealth(Hurt);
        }
    }
Collision2D 2D碰撞类

官方文档:UnityEngine.Collision2D - Unity 脚本 API

在之前的一篇【Unity入门计划】基本概念(2)-触发器 Trigger中就有说到碰撞检测的三种类别。 

在【Unity入门计划】Collision2D类&Collider2D类这篇博客中针对涉及到两个不同类的碰撞检测和触发检测,我对它们的回调函数在脚本中的使用进行一个简单的讨论。

 

关注
打赏
1688896170
查看更多评论

flashinggg

暂无认证

  • 1浏览

    0关注

    83博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文
立即登录/注册

微信扫码登录

0.1586s