Unity2D 相机自适应调整功能的实现

应用:满足主人公在不同位置,屏幕视野出现盲区,或者僵硬,提升用户体验。

P1:正常视野,人物始终保持左下角
image.png
进入上方地形比较多时候,相机扩大
image.png
返回单一地形时,相机收缩到初始Size.
image.png

技术实现

对相机的尺寸、距离、颜色三个字段设置开关(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;
            }
        }
  }

制作相机检测区域

image.png
灰色图片部分大概是检测区,使用Trigger 触发检测器就可以了
image.png

书写触发脚本

接下来就是方法的调用了,大概逻辑:触发器在接触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);
        } 
        
    }

最麻烦的地方

接下来就是不断测试的环节了,也是最麻烦的地方
你不知道需要在【哪个区域】设置【什么样的尺寸】,【用户视角】会最舒服

image.png

为每个需要改变视角的区域。挂载脚本,填写最终需要的数据。
image.png

呼~ 大功告成

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值