Unity相机视野控制与相机旋转

射线检测物体并拖拽物体
using UnityEngine;
public class RaycastTest : MonoBehaviour
{
    private bool isRay=true;
    Vector3 offset;
    Vector3 screenTarget;
    GameObject targetGameObject;//射线碰撞的物体
    RaycastHit hit;
    public LayerMask clickableLayer;//屏幕射线可碰撞的层
    void Update()
    {
        DragObject();
    }

    private void DragObject()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //Debug.DrawLine(ray.origin, Input.mousePosition, Color.red, 5f);//绘制射线,只能在Scene场景下看到
        if (Input.GetMouseButton(0))
        {   
            if (isRay)//鼠标一直按下,拖拽物体时只能发射一次射线,进行一次射线检测
            {
                //Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                if (Physics.Raycast(ray,out hit,100f,clickableLayer.value))
                {
                    Debug.DrawLine(ray.origin, hit.point, Color.red, 5f);//绘制射线,只能在Scene场景下看到
                    targetGameObject = hit.collider.gameObject;//返回射线碰撞到的物体
                    //将射线碰撞到的物体从世界坐标转为屏幕坐标
                    screenTarget = Camera.main.WorldToScreenPoint(targetGameObject.transform.position);
                    offset = targetGameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x,Input.mousePosition.y,screenTarget.z));
                }
                isRay = false;//射线检测一次后不能再次检测
            }
            if (!isRay)//拖拽物体
            {
                Vector3 currentScreenSpace = new Vector3(Input.mousePosition.x,Input.mousePosition.y,screenTarget.z);
                Vector3 currentPosition = Camera.main.ScreenToWorldPoint(currentScreenSpace)+offset;
                targetGameObject.transform.position = currentPosition;
            }
        }
        if (Input.GetMouseButtonUp(0))//鼠标抬起,下次点击鼠标可以再次进行射线检测
        {
            isRay = true;
        }
    }
}
相机移动与旋转
using UnityEngine;
public class ViewChange1 : MonoBehaviour
{
    void Update()
    {
        ScaleView();
        CameraMove();
        RotateCamera();
    }
    //鼠标滚轮改变相机视野大小
    private void ScaleView()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0)   //向上按滚轮,视野变小,物体变大
        {
            transform.GetComponent<Camera>().fieldOfView -= 2;
        }
        else if (Input.GetAxis("Mouse ScrollWheel") < 0)
        {
            transform.GetComponent<Camera>().fieldOfView += 2;
        }
    }
    //W、A、S、D移动相机
    private void CameraMove()
    {
        float h = Input.GetAxisRaw("Horizontal1");
        transform.Translate(Vector3 .right * h * 0.5f, Space.Self);

        float v = Input.GetAxisRaw("Vertical1");
        transform.Translate(Vector3.forward * v * 0.5f, Space.Self);
    }

    private void RotateCamera()
    {
        if (Input .GetMouseButton (1))
        {
            transform.Rotate(Vector3.up * Input.GetAxisRaw("MouseX") * 0.05f, Space.World);
            //transform.Rotate(-Vector3.right * Input.GetAxisRaw("MouseY") * 0.05f, Space.World);
        }
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值