unity中第三人称游戏摄像头遮挡的处理

在游戏开发过程中难免会做第三人称游戏 如果地形中的设施比较多
或者说做一个房间内的游戏 很可能我们调整好的视角 在游戏过程中会被墙体挡住主角
这样游戏体验感就会大打折扣

就像这样(遮住半个身子还是可以的 有的时候可能遮住整个玩家)在这里插入图片描述

这篇博客给大家介绍一个方法让摄像头自动调整到合适角度(缓慢)

我们的想法是在我们调整好的摄像头的角度和玩家的正上方的位置上
中间设置好多个摄像头的位置
然后通过插值运算 实现缓慢的自动调整

至于怎么自动调整 我们用射线来实现
我们摄像头发出射线检测射线碰撞到的物体的标签 如果不是玩家(被遮挡)就换到下一个位置
在这里插入图片描述

 private Vector3 offset;//偏移量

    private Transform Player;

    private void Start()
    {
        Player = GameObject.FindGameObjectWithTag("Player").transform;
        offset = transform.position - Player.position;
        offset = new Vector3(0, offset.y, offset.z);
    }

    private void Update()
    {

        Vector3 BeginPos = offset + Player.position;

        Vector3 EndPos = offset.magnitude * Vector3.up + Player.position;//正上方的坐标

        Vector3 pos1 = Vector3.Lerp(BeginPos, EndPos, 0.25f);
        Vector3 pos2 = Vector3.Lerp(BeginPos, EndPos, 0.5f);
        Vector3 pos3 = Vector3.Lerp(BeginPos, EndPos, 0.75f);


        Vector3[] posArray = new Vector3[] { BeginPos, pos1, pos2, pos3, EndPos };

        Vector3 TargetPos = posArray[0] ;//合适的位置

        RaycastHit hit;
        for(int i = 0; i < 5; i++)
        {
            if(Physics.Raycast(posArray[i],Player.position -posArray[i],out hit))
            {
                if (hit.collider.tag != "Player")
                {
                    //碰撞到别的物体 (被挡住)
                    continue;
                }
                else
                {
                    TargetPos = posArray[i];
                    break;
                }
            }
        }
        //transform.position =TargetPos;

        transform.position = Vector3.Lerp(transform.position, TargetPos, Time.deltaTime);
        transform.LookAt(Player);

    }

这个脚本我用到了Vector3的数组
注意初值的设置,不然会出现奇怪的BUG 因为有些奇怪的位置 可能不符合所有的条件 回到初值的位置

这样就会到一些犄角旮旯的摄像机会自动的切换到合适的视角

在这里插入图片描述

如果你也是unity爱好者 欢迎关注我的博客 我会持续更新我的博客

发布了56 篇原创文章 · 获赞 53 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44302602/article/details/104067697
今日推荐