Unity3D 控制摄像机(一)

Unity3D 控制摄像机(一)

摄像机跟随

Main Camera上按 Ctrl+Alt+F 使镜头对齐当前视角

参考:Unity3D中摄像机跟随方法https://blog.csdn.net/bobowang1991/article/details/54097075


直接把Camera拖动到被角色下作为角色子物体

角色移动时 镜头作为子物体一起移动

优点:最省事


只旋转摄像机自身 和 Player无关 作为第一人称摄像机

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateCamera001 : MonoBehaviour {
    //本例是第一人称摄像机

    public float xSpeed = 2f; //左右旋转摄像机的速度
    public float ySpeed = 2f; //上下旋转摄像机的速度
    public float yMinLimit = -90f; //上下旋转摄像机的最小角度限制
    public float yMaxLimit = 90f;  //上下旋转摄像机的最大角度限制


    //是否旋转镜头 鼠标右键按下时启用
    private bool isRotate;
    //左右旋转的角度 相对世界原始位置 非transform初始位置(沿三维Y轴)
    private float x;
    //上下旋转的角度 相对世界原始位置 非transform初始位置(沿三维X轴)
    private float y;


    void Start ()
    {
        Vector3 angles = transform.eulerAngles;
        //鼠标的左右移动 在三维中相当于沿Y轴转动
        x = angles.y;
        //鼠标的上下移动 在三维中相当于沿X轴转动
        y = angles.x;
    }


    void LateUpdate ()
    {
        //在LateUpdate中更新摄像机 可以更平滑 在Update中会有抖动
        RotateCamera();
    }


    void RotateCamera()
    {
        //鼠标右键按下状态启用旋转摄像机
        if (Input.GetMouseButtonDown(1))
        {
            isRotate = true;
        }

        //鼠标右键抬起状态停止旋转摄像机
        if (Input.GetMouseButtonUp(1))
        {
            isRotate = false;
        }

        if (isRotate)
        {
            //x 和 y 是绝对值 相对于世界坐标没有转动的位置的最终转动位置

            //鼠标的上下移动 移动的Y值 在三维中相当于沿X轴转动
            y -= Input.GetAxis("Mouse Y") * ySpeed;
            //上下需要限定范围 在完全俯视 和 完全仰视之间
            //去掉该限制的话可以使摄像机倒置
            y = Mathf.Clamp(y, yMinLimit, yMaxLimit);


            //鼠标的左右移动 移动的X值 在三维中相当于沿Y轴转动
            //左右是允许360度旋转的 不需要限制到最大最小范围
            x += Input.GetAxis("Mouse X") * xSpeed;

            //Quaternion rotation = Quaternion.Euler(y, x, 0);
            //transform.rotation = rotation;

            //和上面2句等价
            transform.eulerAngles = new Vector3(y, x, 0);
        }
    }
}

该脚本效果 图示为Local坐标系 旋转引发Local坐标系的变化

这里写图片描述

几点说明

  • Input.GetMouseButtonDown 只会在鼠标按键变化时触发一次 保持按住状态不会触发 因此需要使用全局变量IsRotate来判断是否旋转
    比如下述方法就是错误的:
    if (Input.GetMouseButtonDown(1))
    {
    直接处理旋转
    }
  • transform.eulerAngles欧拉角必须三个值一起设置
  • transform.eulerAngles欧拉角设置的是最终位置 最终位置是相对于世界坐标系 而非Local坐标系 也不是相对当前位置的改变量
  • 第一人称摄像机鼠标右键按下时 本身只改变Rotation而不改变Position
  • 上下的旋转需要限定位置 上下旋转即沿红色轴(X)轴旋转(世界坐标系) 左右旋转目前没有限定位置 正常人只能看左右-90 至90
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值