Unity3d 类似Scene窗口的鼠标变换控制

刚刚在学习光线跟踪,通过控制Camera里的Transform来进行观察渲染结果是在不方便,就写了一个简单的鼠标控制,记录一下,以后要用的话就可以直接复制了 美滋滋。

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

public class CameraTransform : MonoBehaviour
{
    [SerializeField]
    Transform _camera;
    [SerializeField]
    float _translateSpeed=30;
    [SerializeField]
    float _rotateSensitivity=240;

    bool _bSpeedUp;
    float _acTranslateSpeed = 60;

    // Update is called once per frame
    void Update()
    {
        if (_camera == null)
            _camera = GameObject.FindGameObjectWithTag("Main Camera").GetComponent<Transform>();

        InputCtrl();
    }
    void InputCtrl()
    {
        if (Input.GetMouseButton(1))
        {
            Vector3 offset = Vector3.zero;
            bool bInput = false;
            CalTranslateOffset(out offset,out bInput);
            if (bInput)
                Translate(offset);
            bInput = false;
            Vector2 angleOffset = Vector2.zero;
            CalRotateOffset(out angleOffset, out bInput);
            if (bInput)
                Rotation(angleOffset);
        }
       

    }
    void CalRotateOffset(out Vector2 angleOffset, out bool bInput)
    {
        float h=Input.GetAxis("Mouse X");
        float v = Input.GetAxis("Mouse Y");
        if (Mathf.Abs(h) > 0.005 || Mathf.Abs(v) > 0.005f)
        {
            bInput = true;
            angleOffset = new Vector3(h * _rotateSensitivity * Time.deltaTime, v * _rotateSensitivity * Time.deltaTime);
        }
        else
        {
            bInput = false;
            angleOffset = Vector2.zero;
        }
    }


    void CalTranslateOffset(out Vector3 offset,out bool bInput)
    {
        offset = Vector3.zero;
        bInput = false;
        float currentSpeed = _translateSpeed ;
        if(Input.GetKey(KeyCode.LeftShift))
        {
            _bSpeedUp = true;
            currentSpeed = _acTranslateSpeed;
        }
        if (Input.GetMouseButton(1))
        {
            if (Input.GetKey(KeyCode.W))
            {
                bInput = true;
                offset += _camera.forward.normalized * currentSpeed * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.S))
            {
                bInput = true;
                offset += -1 * _camera.forward.normalized * currentSpeed * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.A))
            {
                bInput = true;
                offset += -1 * _camera.right.normalized * currentSpeed * Time.deltaTime;
            }
            if (Input.GetKey(KeyCode.D))
            {
                bInput = true;
                offset += _camera.right.normalized * currentSpeed * Time.deltaTime;
            }
        }
        _bSpeedUp = false;
    }
    void Translate(Vector3 offset)
    {
        Vector3 targetPosition = _camera.transform.position;
        targetPosition += offset;
        _camera.transform.localPosition = targetPosition;
    }
    void Rotation(Vector2 offset)
    {
        Vector3 targetAngle = _camera.localRotation.eulerAngles;
        targetAngle.x -= offset.y;
        targetAngle.y += offset.x;
        _camera.localRotation = Quaternion.Euler(targetAngle);

        //_camera.Rotate(-Vector3.right, offset.y);
        //_camera.Rotate(Vector3.up, offset.x);
    }

}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值