Unity3D仿星露谷物语开发11之添加Scenary Fader

1、目标

当角色移动到草/树的后面时,因为草/树层级优先级大于等于角色,导致角色无法全部展示。

如下图所示,草遮挡了一半的角色,而树则遮挡了全部的角色。

我们希望当角色走到草/树的后面时,草/树能够改变透明度(不再是1),从而在Game界面可以看到角色。

2、创建Fader脚本

该程序执行物体淡出 / 淡入的操作。

淡出时:会在指定时间内减少alpha值到某个值

淡入时:会在指定时间内增加alpha值到1。

当玩家与物体碰撞(Trigger)后会执行淡出操作,当玩家离开物体后会执行淡入操作。

(1)Settings中配置参数值

在Assets -> Scripts -> Misc -> Settings.cs中新增代码如下:

// Obscuring Item Fader
public const float fadeInSeconds = 0.25f;
public const float fadeOutSeconds = 0.35f;
public const float targetAlpha = 0.45f;

目前Settings.cs的完整代码如下:

using UnityEngine;

public static class Settings
{
    // Obscuring Item Fader
    public const float fadeInSeconds = 0.25f;
    public const float fadeOutSeconds = 0.35f;
    public const float targetAlpha = 0.45f;

    // Player Movement
    public const float runningSpeed = 5.333f;
    public const float walkingSpeed = 2.666f;

    // Player Animation Parameters
    public static int xInput;
    public static int yInput;
    public static int isWalking;
    public static int isRunning;
    public static int toolEffect;
    public static int isUsingToolRight;
    public static int isUsingToolLeft;
    public static int isUsingToolUp;
    public static int isUsingToolDown;
    public static int isLiftingToolRight;
    public static int isLiftingToolLeft;
    public static int isLiftingToolUp;
    public static int isLiftingToolDown;
    public static int isSwingingToolRight;
    public static int isSwingingToolLeft;
    public static int isSwingingToolUp;
    public static int isSwingingToolDown;
    public static int isPickingRight;
    public static int isPickingLeft;
    public static int isPickingUp;
    public static int isPickingDown;

    // Shared Animation Parameters
    public static int idleUp;
    public static int idleDown;
    public static int idleLeft;
    public static int idleRight;


    // static constructor
    static Settings()
    {
        xInput = Animator.StringToHash("xInput");
        yInput = Animator.StringToHash("yInput");
        isWalking = Animator.StringToHash("isWalking");
        isRunning = Animator.StringToHash("isRunning");
        toolEffect = Animator.StringToHash("toolEffect");
        isUsingToolRight = Animator.StringToHash("isUsingToolRight");
        isUsingToolLeft = Animator.StringToHash("isUsingToolLeft");
        isUsingToolUp = Animator.StringToHash("isUsingToolUp");
        isUsingToolDown = Animator.StringToHash("isUsingToolDown");
        isLiftingToolRight = Animator.StringToHash("isLiftingToolRight");
        isLiftingToolLeft = Animator.StringToHash("isLiftingToolLeft");
        isLiftingToolUp = Animator.StringToHash("isLiftingToolUp");
        isLiftingToolDown = Animator.StringToHash("isLiftingToolDown");
        isSwingingToolRight = Animator.StringToHash("isSwingingToolRight");
        isSwingingToolLeft = Animator.StringToHash("isSwingingToolLeft");
        isSwingingToolUp = Animator.StringToHash("isSwingingToolUp");
        isSwingingToolDown = Animator.StringToHash("isSwingingToolDown");
        isPickingRight = Animator.StringToHash("isPickingRight");
        isPickingLeft = Animator.StringToHash("isPickingLeft");
        isPickingUp = Animator.StringToHash("isPickingUp");
        isPickingDown = Animator.StringToHash("isPickingDown");
        idleUp = Animator.StringToHash("idleUp");
        idleDown = Animator.StringToHash("idleDown");
        idleLeft = Animator.StringToHash("idleLeft");
        idleRight = Animator.StringToHash("idleRight");
    }

}

(2)淡入淡出效果的脚本

在Scripts下新建Item的目录。

并在其下创建ObscuringItemFader.cs脚本。

using System.Collections;
using UnityEngine;

[RequireComponent(typeof(SpriteRenderer))]
public class ObscuringItemFader : MonoBehaviour
{
    private SpriteRenderer spriteRenderer;

    // Start is called before the first frame update
    private void Awake()
    {
        spriteRenderer = gameObject.GetComponent<SpriteRenderer>();
    }

    public void FadeOut()
    {
        StartCoroutine(FadeOutRoutine());
    }

    public void FadeIn() 
    {
        StartCoroutine(FadeInRoutine());
    }

    private IEnumerator FadeInRoutine()
    {
        float currentAlpha = spriteRenderer.color.a;
        float distance = 1f - Settings.targetAlpha;

        while (1f - currentAlpha > 0.01f)
        {
            currentAlpha = currentAlpha + distance / Settings.fadeInSeconds * Time.deltaTime;
            spriteRenderer.color = new Color(1f, 1f, 1f, currentAlpha);
            yield return null;
        }

        spriteRenderer.color = new Color(1f, 1f, 1f, 1f);
    }

    private IEnumerator FadeOutRoutine()
    {
        float currentAlpha = spriteRenderer.color.a;
        float distance = currentAlpha - Settings.targetAlpha;

        while(currentAlpha - Settings.targetAlpha > 0.01f)
        {
            currentAlpha = currentAlpha - distance / Settings.fadeOutSeconds * Time.deltaTime;
            spriteRenderer.color = new Color(1f, 1f, 1f, currentAlpha);
            yield return null;
        }

        spriteRenderer.color = new Color(1f, 1f, 1f, Settings.targetAlpha);
    }
}

该脚本需要附加到 与角色发生碰撞后 需要模糊处理的物体上。

  • [RequireComponent(typeof(SpriteRenderer))]:该脚本使用的前提是当前对象有SpriteRenderer组件
  • distance / Settings.fadeOutSeconds * Time.deltaTime:每一帧的变动值。
  • SpriteRenderer的Color:默认的Color为(1f,1f,1f,1f)

  • yield return null:当使用yield return null时,协程会在下一帧继续执行。这意味着协程将暂停一帧,然后在下一帧继续执行。使用yield return null可以在每一帧之间进行操作,比如更新游戏对象的位置、旋转或者其他计算。

(3)触发淡入淡出的脚本

在Scripts -> Item目录下创建TriggerObscuringItemFader脚本。

using UnityEngine;

public class TriggerObscuringItemFader : MonoBehaviour
{

    private void OnTriggerEnter2D(Collider2D collision)
    {
        // Get the gameobject we have collided with, and then get all the Obscuring Item Fader components on it and its children - and then trigger the fade out
        ObscuringItemFader[] obscuringItemFaders = collision.gameObject.GetComponentsInChildren<ObscuringItemFader>();   

        if(obscuringItemFaders.Length > 0)
        {
            for(int i = 0; i < obscuringItemFaders.Length; i++)
            {
                obscuringItemFaders[i].FadeOut();
            }
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        // Get the gameobject we have collided with, and then get all the Obscuring Item Fader components on it and its children - and then trigger the fade in
        ObscuringItemFader[] obscuringItemFaders = collision.gameObject.GetComponentsInChildren<ObscuringItemFader>();

        if (obscuringItemFaders.Length > 0)
        {
            for (int i = 0; i < obscuringItemFaders.Length; i++)
            {
                obscuringItemFaders[i].FadeIn();
            }
        }
    }

}

collision.gameObject 是碰撞中的另一个游戏对象。

GetComponentsInChildren<Type>() 是一个用于获取游戏对象及其所有子对象的组件的函数。

3、给Bush和Tree添加Fader脚本

给Prefabs -> Scenary中的CanyonOaScenary和WildOakScenary分别添加Box Collider 2D组件和ObscuringItemFader组件。

其中需要勾选Box Collider 2D组件的Is Trigger属性。

CanyonOaScenary还包括Trunk部分,所以也需要添加Box Collider 2D组件和ObscuringItemFader组件。

TumbleweedThistle预设体比较特殊,因为我们已经给它添加了Box Collider 2D组件,放置角色穿透它。

那我们的做法是:给它添加另外一个Box Collider 2D组件作为Trigger,但是Trigger只是位于上半部分,和Collider不重叠。

Trigger部分的区域如下(为了避免两个Collider不好操作,可以暂时先反选第一个Collider)。

然后再添加ObscuringItemFader组件。

4、给Player添加TriggerObscuringItemFader组件

效果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/945153.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

021-spring-springmvc

比较重要的部分 比较重要的部分 比较重要的部分 关于组件的部分 这里以 RequestMappingHandlerMapping 为例子 默认的3个组件是&#xff1a; org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping org.springframework.web.servlet.mvc.method.annotation.Requ…

关于 PCB线路板细节锣槽问题 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/144783817 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

无人机快速巡检、森林、电力、水利大大节省人力成本,降低风险事故

无人机在快速巡检、森林、电力、水利等领域的应用&#xff0c;确实大大节省了人力成本&#xff0c;并有效降低了风险事故。以下是对这些应用的详细分析&#xff1a; 一、无人机快速巡检 无人机快速巡检技术以其高效性、安全性和精准性&#xff0c;在众多领域展现出了巨大的应…

生态碳汇涡度相关监测与通量数据分析实践技术应用

基于MATLAB语言、以实践案例为主&#xff0c;提供所有代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例&#xff0c;基于MATLAB开展上机操作&#xff1a; 2、涡度通量观测基本概况&#xff1a;观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1a…

【Lua之·Lua与C/C++交互·Lua CAPI访问栈操作】

系列文章目录 文章目录 前言一、概述1.1 Lua堆栈 二、栈操作2.1 基本的栈操作2.2 入栈操作函数2.3 出栈操作函数2.4 既入栈又出栈的操作函数2.5 栈检查与类型转换函数2.5 获取表数据 三、实例演示总结 前言 Lua是一种轻量级的、高性能的脚本语言&#xff0c;经常被用于游戏开发…

安装OpenGauss数据库流程

一、安装完欧拉系统将yum上传至本地&#xff1a; 创建文件 mkdir /media/iso 挂载镜像 mount /dev/sr0 /media/iso 未通网情况&#xff0c;删除自带的yum&#xff0c;创建一个新的 cd /etc/yum.repos.d/ rm -r 加yum文件名称 &#xff08;删除自带yum&#xff09; v…

Go语言zero项目服务恢复与迁移文档

## 一. 服务器环境配置 在迁移和配置 项目时&#xff0c;首先需要确保服务器环境正确配置。以下是配置步骤&#xff1a; ### 1. 安装 Go 语言环境 首先&#xff0c;确保 Go 语言环境已经安装&#xff0c;并且配置正确。执行以下步骤&#xff1a; # 下载 Go 语言安装包 wge…

【 Sonarqube】可视化Java项目单元测试覆盖率统计框架搭建

一、项目背景&#xff1a; 一个小公司的朋友反应他们那边Java项目单元测试有&#xff0c;但还没有可视化统计覆盖率数据&#xff0c;没法统计就不能直观的看到单测的覆盖率&#xff0c;Java的覆盖率统计框架还是比较成熟&#xff0c;部署起来也不是很难&#xff0c;下面我们逐…

使用ForceBindIP绑定应用到指定IP

前言 使用ForceBindIP工具&#xff0c;用户可以轻松地将特定应用程序绑定到指定的IP地址&#xff0c;从而确保应用程序的网络连接通过指定的网络适配器进行。通过在命令提示符下运行ForceBindIP并指定IP地址和应用程序的完整路径&#xff0c;用户能够控制应用程序的网络流量&a…

Webpack学习笔记(6)

首先搭建一个基本的webpack环境&#xff1a; 执行npm init -y&#xff0c;创建pack.json&#xff0c;保存安装包的一些信息 执行npm install webpack webpack-cli webpack-dev-server html-webpack-plugin -D&#xff0c;出现node_modules和package-lock.json。 1.source-Ma…

【学生管理系统】element ui级联菜单bug

级联后端 通过父id来进行查询 GetMapping("/{parentId}")public BaseResult findAllByParentId(PathVariable("parentId") String parentId){//1 根据父id查询所有城市QueryWrapper<TbCity> queryWrapper new QueryWrapper<>();queryWrapper.…

关于无线AP信道调整的优化(锐捷)

目录 一、信道优化的基本原则二、2.4G频段信道优化三、5G频段信道优化四、信道优化代码具体示例五、其他优化措施 一、信道优化的基本原则 信道优化旨在减少信道间的干扰&#xff0c;提高网络覆盖范围和信号质量。基本原则包括&#xff1a; 1. 选择合适的信道&#xff1a;根据…

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程

Ubuntu 下使用命令行将 U 盘格式化为 ext4、FAT32 和 exFAT 的详细教程 作者&#xff1a;Witheart更新时间&#xff1a;20241228 本教程将详细介绍如何将 U 盘格式化为 ext4、FAT32 和 exFAT 文件系统&#xff0c;同时包括如何安装必要工具&#xff08;如 exfat-utils&#x…

【设计与实现】基于Bootstrap的地方旅游管理系统的设计与实现

目录 第一章 绪论 1.1 研究现状 1.2 设计原则 1.3 研究内容 第四章 系统设计 4.1系统结构设计 4.2系统顺序图设计 4.3数据库设计 第五章 系统实现 5.1登录模块的实现 第一章 绪论 1.1 研究现状 时代的发展&#xff0c;我们迎来了数字化信息时代&#xff0c;它正在渐…

【MySQL高级】索引

MySQL高级课程简介 序号010203041基本硬件知识体系结构应用优化MySQL 常用工具2索引存储引擎查询缓存优化MySQL 日志3视图优化SQL步骤内存管理及优化MySQL 主从复制4存储过程和函数索引使用MySQL锁问题5触发器SQL优化常用SQL技巧 1. 基本硬件知识 1.1 计算机工作原理 1.中央处…

【Redis】:初识Redis

1.1 盛赞 Redis Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的 NoSQL 数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由 string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xf…

在Linux centos7环境下部署wblogic使用weblogic部署war包项目

准备工作 1、一台配置好centos的虚拟机、 2、关闭并禁用防火墙 3、配置好yum源下载&#xff08;zip、vim、unzip&#xff09;等工具 4、jdk安装包 一&#xff0c;jdk的安装 将jdk安装包上传到opt目录里 [rootlocalhost ~]# cd /opt 解压jdk安装包 [rootlocalhost opt]…

Xdebug

1、开启xdebug扩展 2、修改一下php.ini文件 xdebug.remote_enable 1 xdebug.remote_autostart 13、vscode安装插件php debug 4、生成launch.json文件&#xff0c;好像啥都不用改 5、vscode没有配置php路径的&#xff0c;需要去配置&#xff1a; 6、发起请求 8、代码断…

QWidget应用封装为qt插件,供其他qt应用调用

在之前的文章中,有介绍通过QProcess的方式启动QWidget应用,然后将其窗口嵌入到其他的qt应用中,作为子窗口使用.这篇文章主要介绍qt插件的方式将QWidget应用的窗口封装为插件,然后作为其他Qt应用中的子窗口使用. 插件优点: 与主程序为同一个进程,免去了进程间繁琐的通信方式,…

人工智能与云计算的结合:如何释放数据的无限潜力?

引言&#xff1a;数据时代的契机 在当今数字化社会&#xff0c;数据已成为推动经济与技术发展的核心资源&#xff0c;被誉为“21世纪的石油”。从个人消费行为到企业运营决策&#xff0c;再到城市管理与国家治理&#xff0c;每个环节都在生成和积累海量数据。然而&#xff0c;数…