Featured image of post 麦田物语开发日记(二)

麦田物语开发日记(二)

麦田物语场景内容设置及场景内容的遮挡剔除效果

场景设置

设置边界

在cinemachine中设定Confiner(不用刻意选择confiner),然后选择摄像机的碰撞范围

由于边界需要是一个GO,因此我们需要设置一个独立的GO,然后为其设置碰撞体,由于地图大小不一定相同,因此采用polygon Collder2d完成

由于每个场景都是独立的,而Bound在不同的地图之中,因此该GO不能直接赋值给CineMachine

,需要通过代码去获得该Bound然后赋值给CineMachine

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 挂载到CineMachine中
public class SwitchBounds : MonoBehaviour
{
    private void Start()
    {
        //todo 在切换场景时修改
        SwitchConfinerShape();
    }

    // 在切换场景之后修改边界
    private void SwitchConfinerShape()
    {
        
        PolygonCollider2D confinerShape = GameObject.FindGameObjectWithTag("BoundsConfiner")
            .GetComponent<PolygonCollider2D>();
        
        CinemachineConfiner cinemachineConfiner = GetComponent<CinemachineConfiner>();
        cinemachineConfiner.m_BoundingShape2D = confinerShape;
        cinemachineConfiner.InvalidatePathCache();      // 清除切换边界的缓存(runtime)
    }
}

注意需要将该碰撞器设置为isTriger否则会与人物将碰撞

设置树木遮挡渐变

为树木设置碰撞体,如果发生碰撞,就将数的sprite的透明度调低

设置一个通用的脚本来管理所有需要被透明化的物体

基础的透明化执行逻辑通常是通过携程,去不断缩小sprite的透明度,但是当item过多的时候,会导致携程开的过多,因此为了让代码更加简单,因此采用一个工具Dotween。该插件可以帮助我们很好的管理所有界面效果


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* 由于需要对物体的sprite的透明度进行修改,因此必须有sprite Renderer*/
[RequireComponent(typeof(SpriteRenderer))]
public class ItemFader : MonoBehaviour
{
    private SpriteRenderer _spriteRenderer;
    private void Awake()
    {
        _spriteRenderer = GetComponent<SpriteRenderer>();
    }
    
    /* 设置两个函数,当player和当前物体碰撞的时候,调用该函数*/
    /// <summary>
    /// 逐渐恢复颜色
    /// </summary>
    public void FadeIn()
    {
        Color targetColor = new Color(1, 1, 1, 1);
        // 使用dotween修改物体的颜色
        _spriteRenderer.DOColor(targetColor, Settings.FadeDuration);
    }
    
    /// <summary>
    /// 颜色逐渐变淡
    /// </summary>
    public void FadeOut()
    {
        Color targetColor = new Color(1, 1, 1, Settings.TargetAlpha);
        // 使用dotween修改物体的颜色
        _spriteRenderer.DOColor(targetColor, Settings.FadeDuration);
    }

}

然后在人物身上挂载新的脚本,当发生碰撞的是将被碰撞物挂在itemFader的子物体进行淡入淡出

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
/***
 * 当与场景物体重叠时,将场景物体半透明化
 */
public class TriggerItemFader : MonoBehaviour
{
    /// <summary>
    /// 发生碰撞时,如果被碰撞的物体可以淡化,则对其子物体进行淡化处理
    /// </summary>
    /// <param name="other">碰撞物体</param>
    private void OnTriggerEnter2D(Collider2D other)
    {
        // 获得当前碰撞物体的ItemFader
        ItemFader[] faders = other.GetComponentsInChildren<ItemFader>();
        if (faders.Length > 0)
        {
            foreach (var fader in faders)
            {
                fader.FadeOut();
            }
        }
        

    }

    /// <summary>
    /// 不再发生碰撞时,则恢复淡化效果
    /// </summary>
    /// <param name="other">碰撞物体</param>
    private void OnTriggerExit2D(Collider2D other)
    {
        ItemFader[] faders = other.GetComponentsInChildren<ItemFader>();
        if (faders.Length > 0)
        {
            foreach (var fader in faders)
            {
                fader.FadeIn();
            }
        }
    }
}

注意:由于我们设置的是寻找某一个父物体发生碰撞,然后子物体的sprite变色,因此对于单个图层的物体需要为其创建一个父物体

Built with Hugo
Theme Stack designed by Jimmy