【Unity相机控制】相机移动后滞,旋转自动归位

前言

素材来自unity官方教程。

  • 实现人物移动,相机跟随,但有一定的后滞效果
  • 类似小小梦魇的视角旋转:小小梦魇相机可以左右旋转,但非常有限。并且玩家如果放开控制键,视角自动回到原处。
    不使用插件,简单实现。
    效果如下:

    JohnHaunt

代码实现

using UnityEngine;

public class CameraCTRL : MonoBehaviour
{
    // get the character transform
    private Transform character;

    private PlayerControl player;
    // get offset from camera to character
    private Vector3 offset;
    [Range(1f,2f)]
    public float camSpeed = 1.5f;
    public float maxCameraRotX= 5f;
    public float minCameraRotX = -5f;
    
    // check whether mouse is always held
    private bool isMouse = false;
    //
    private float pre_rotx = 0f;
    private Vector3 cam_rot_ori;
    // check mouse
    private float cur_mouse_Y = 0f;
    private float pre_mouse_Y = 0f;
    private float delta_mouse_Y = 0f;

    void Start()
    {
        character = GameObject.Find("JohnLemon").transform;
        player = GameObject.Find("JohnLemon").GetComponent<PlayerControl>();
        offset = this.transform.position - character.position;
        if (minCameraRotX >= maxCameraRotX)
        {
            minCameraRotX = maxCameraRotX - 5f;
        }

        cam_rot_ori = transform.eulerAngles;
        pre_rotx = transform.eulerAngles.x;

        camPosInitial();
    }

    // Update is called once per frame
    void Update()
    {
        //移动
        this.transform.position = Vector3.Lerp(this.transform.position, character.position + offset, Time.deltaTime*camSpeed);
        
        Vector3 moveDirection =player.moveDirection;
        //俯仰
        if (Input.GetMouseButton(0))
        {
            isMouse = true;
            cur_mouse_Y = Input.mousePosition.y;

            if (pre_mouse_Y != 0f)
            {
                delta_mouse_Y = cur_mouse_Y - pre_mouse_Y;

                Vector3 rot = Vector3.zero;
                if (delta_mouse_Y < 0f)
                {
                    rot.x = pre_rotx-minCameraRotX;
                    rot.y = transform.eulerAngles.y;
                    transform.eulerAngles = Vector3.Lerp(transform.eulerAngles, rot,Time.deltaTime*camSpeed);
                }
                else if (delta_mouse_Y > 0f)
                {
                    rot.x = pre_rotx-maxCameraRotX;
                    rot.y = transform.eulerAngles.y;
                    transform.eulerAngles = Vector3.Lerp(transform.eulerAngles, rot,Time.deltaTime*camSpeed);
                }
            }

            pre_mouse_Y = cur_mouse_Y;
        }

        if (Input.GetMouseButtonUp(0))
        {
            pre_mouse_Y = 0f;
            isMouse = false;

        }

        if (!isMouse)
        {
            cam_rot_ori.y = transform.eulerAngles.y;//y is free;
            transform.eulerAngles = Vector3.Lerp(transform.eulerAngles, cam_rot_ori, Time.deltaTime * camSpeed);
        }

    }

    void camPosInitial()
    {
        // fix camera
        Vector3 look_dir = character.position - transform.position ;
        look_dir.y = 0f;
        look_dir.Normalize();

        Vector3 player_dir = character.forward;
        player_dir.y = 0;
        player_dir.Normalize();
        float angle = Mathf.Acos(look_dir.x*player_dir.x+look_dir.z*player_dir.z)*180/Mathf.PI;
        transform.RotateAround(character.position,character.up,-angle);
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值