Unity3D 游戏开发:实现景观物体遮挡半透明(11)

1,187 阅读4分钟

一、开发操作

1、在修改还Tree Green的Perfabs中的模型为其添加组件(Component)

1)、在Tree\_trunk上添加Box collider 2D防止人物穿模

image.png

2)、在父物体上添加Box collider 2D检测人物是否为经过

image.png

二、脚本编程

1、Setting

在Unity中用于设置游戏中一些常量值。

通过常量定义在Settings类中,可以在整个游戏中统一管理它们,而不必在每个场景或游戏对象中单独设置它们。其他脚本可以通过Settings.fadeDuration和Settings.targetAlpha这两个常量来访问它们。

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

public class Settings 
{
    public const float fadeDuration = 0.35f;
    public const float targetAlpha = 0.45f;
}

fadeDuration被设置为一个浮点数0.35f,它表示游戏中UI渐变效果的持续时间,当一些UI元素消失时会使用该效果。

targetAlpha被设置为一个浮点数0.45f,它表示UI渐变效果的目标透明度。这个透明度通常通过颜色alpha值控制,目的是使UI元素的出现和消失更加平滑。

2、ItemFader

在Unity中淡入淡出SpriteRenderer组件的方法。它使用DOTween插件(一个Unity动画插件)来控制SpriteRenderer组件的颜色。

首先,该脚本加载SpriteRenderer组件,它通过Awake()方法来完成这个步骤。

接着,该脚本提供了两个公共方法FadeIn()和FadeOut(),它们用于控制SpriteRenderer组件的淡入淡出效果。对于FadeIn()方法,它会将SpriteRenderer的颜色从透明度0渐变到完全不透明1。对于FadeOut()方法,它会将SpriteRenderer的颜色从完全不透明1渐变到半透明状态Settings.targetAlpha。

这些渐变效果是通过创建一个新的Color实例targetColor来实现的。然后,使用DOTween来对SpriteRenderer组件进行颜色渐变,其中“Settings.fadeDuration”指定了颜色渐变所需的时间。

注意到这个脚本被挂载在一个游戏对象上,并且该游戏对象必须包含一个SpriteRenderer组件(因为我们使用了\[RequireComponent(typeof(SpriteRenderer))])。这样做是为了确保在运行时,SpriteRenderer总是可以被正确地访问和使用。

using DG.Tweening;
using UnityEngine;

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

    private void Awake()
    {
        spriteRenderer = GetComponent<SpriteRenderer> (); 
    }

    public void FadeIn()
    {
        Color targetColor = new Color(1, 1, 1, 1);
        spriteRenderer.DOColor(targetColor ,Settings.fadeDuration);
    }
    public void FadeOut()
    {
        Color targetColor = new Color(1, 1, 1, Settings.targetAlpha);
        spriteRenderer.DOColor(targetColor, Settings.fadeDuration);
    }
}

3、TriggerItemFader

TriggerItemFader类包含了两个方法OnTriggerEnter2D()和OnTriggerExit2D(),它们响应称为“触发器”的特殊Collider2D(2D碰撞器)进入或离开TriggerItemFader对象的范围内。

当碰撞器进入TriggerItemFader的触发器范围时,每个附加到碰撞器子游戏对象上的ItemFader脚本都会执行FadeOut()方法,使其逐渐消失;当碰撞器离开TriggerItemFader的触发器范围时,同样的ItemFader组件会执行FadeIn()方法来让其逐渐出现。

在脚本中,我们使用了GetComponentsInChildren()来获取碰撞器内所有子游戏对象上的ItemFader组件,然后对它们进行逐个遍历,调用FadeIn和FadeOut来实现渐变效果。

这个脚本允许开发者通过将它挂载在场景中的区域游戏对象上,来控制附近SpriteRenderer组件的出现和消失效果。

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

public class TriggerItemFader : MonoBehaviour
{
    private void OnTriggerEnter2D(Collider2D other )
    {
        ItemFader[] faders = other.GetComponentsInChildren <ItemFader>();
        if (faders.Length > 0)
        {
            foreach (var  item  in faders)
            {
                item.FadeOut();
            }
        } 
    }
    private void OnTriggerExit2D(Collider2D other )
    {
        ItemFader[] faders = other.GetComponentsInChildren<ItemFader>();
        if (faders.Length > 0)
        {
            foreach (var item in faders)
            {
                item.FadeIn();
            }
        }
    }
}

三、初步了解脚本编程

RequireComponent是Unity引擎中的一个特性(Attribute),用于自动向游戏物体上添加其它需要组件。例如,如果一个脚本使用了RequireComponent(typeof(Rigidbody)),这意味着如果一个开发者将该脚本添加到游戏对象上,Unity就会自动添加Rigidbody组件到该游戏对象上,以保证该脚本的正确运行。

这个特性通常用于简化代码。在某些情况下,一个脚本依赖于另一个组件的存在,如果没用RequireComponent特性,则需要在代码中编写添加组件的逻辑代码,使用这个特性可以使代码更加简洁和易于维护。

需要注意的是,一个游戏对象上只能有一个单独组件类型的RequireComponent。如果你想要在同一个游戏对象上挂载两个使用了相同RequireComponent的脚本,那么Unity会在控制台上报警告。

foreach语句中的var关键字定义了一个迭代变量item,该变量会用来迭代faders数组中的元素(即ItemFader组件)。

这里的“var”是一种隐式类型声明语法,允许编译器根据初始化值自动推断变量类型。在这个例子中,由于我们没有显式地声明变量类型,C#编译器会自动推断出item变量的类型为ItemFader。

由于在foreach循环中,我们通常是迭代并处理一个集合或数组中的每个元素,所以可以用foreach语句方便地遍历集合或数组中的项。每次迭代后,item变量就会指向下一个集合中的元素,直到所有元素都被处理完毕。这比使用for循环来遍历集合或数组更加简洁和易读。

阅读更多作者文章:

Unity3D MaiTianWuYv:设置摄像机边界(10)