应用:满足主人公在不同位置,屏幕视野出现盲区,或者僵硬,提升用户体验。
P1:正常视野,人物始终保持左下角
进入上方地形比较多时候,相机扩大
返回单一地形时,相机收缩到初始Size.
技术实现
对相机的尺寸、距离、颜色三个字段设置开关(e.g. 距离为例)
public void SetSize(float size)
{
startSizeLerp = true;//打开开关
targetSize = size;
}
/// <summary>
/// 设置背景颜色
/// </summary>
/// <param name="color"></param>
public void SetColor(Color color)
{
startColorLerp = true;
targetColor = color;
}
public void SetPos(Vector3 pos)
{
startPosLerp = true;
targetPos = pos;
}
}
以距离为例,LateUpdate()中插值
void LateUpdate()
{
//位置
if (startPosLerp)//距离插值开关打开
{
if (Vector3.Distance(transform.localPosition, targetPos) > 0.1f)//持续插值满足条件
{
//Lerp插值,相机是主人公的子节点,采用LocalPostion
transform.localPosition = Vector3.Lerp(transform.localPosition, targetPos, lerpSpeed * Time.deltaTime);
}
else
{
startPosLerp = false;
}
}
}
制作相机检测区域
灰色图片部分大概是检测区,使用Trigger 触发检测器就可以了
书写触发脚本
接下来就是方法的调用了,大概逻辑:触发器在接触Player时,调用各个字段的Set方法设置指定区域相机需要的尺寸、位置和颜色,离开区域时 复原Main Camera的原参数,【声明一下,这个游戏到这个阶段,前期的相机跟随已经写好了,所以一直是Player的子节点,所以一直用的相对位置LocalPostion】
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.name == "Gris")
{
Debug.Log(collision.name);
if(pos != Vector3.zero)
{
cc.SetPos(pos);
}
if(size != 0)
{
cc.SetSize(size);
}
if(color != Color.clear)
{
cc.SetColor(color);
}
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.name == "Gris")
{
cc.SetPos(new Vector3(-13.4f, 6.6f, 2));
cc.SetSize(5);
}
}
最麻烦的地方
接下来就是不断测试的环节了,也是最麻烦的地方
你不知道需要在【哪个区域】设置【什么样的尺寸】,【用户视角】会最舒服
为每个需要改变视角的区域。挂载脚本,填写最终需要的数据。