场景设置
设置边界
在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变色,因此对于单个图层的物体需要为其创建一个父物体