unity摄像机切换

文章详细描述了一个Unity脚本,通过鼠标操作和UGUI事件来控制三个预设相机的切换过程。
摘要由CSDN通过智能技术生成

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class CameraChange : MonoBehaviour
{
    public GameObject CameraMain;
    public GameObject Camera2;
    public GameObject Camera3;


    private Vector3 Position;
    private Quaternion Rotation;//临时存储相机的位置和旋转信息

    void Update()
    {//首先检查鼠标左键是否按下。如果按下且光标位于某个UI元素上方,则调用Skode_GetCurrentSelect()获取当前选中的UI对象。
     //接着判断该对象的名称,若为"View1"或"View2",则调用CameraLocationExChange()方法交换相应相机的位置和旋转
        if (Input.GetMouseButtonDown(0))
        {
            if (EventSystem.current.IsPointerOverGameObject())
            {
                GameObject obj = Skode_GetCurrentSelect();

                if (obj != null)
                {
                    //点击视角1
                    if (obj.name == "View1")
                    {
                        CameraLocationExChange(CameraMain, Camera2);
                    }
                    //点击视角2
                    else if (obj.name == "View2")
                    {
                        CameraLocationExChange(CameraMain, Camera3);

                    }
                }


                Debug.Log("点击到UGUI的UI界面");
            }
            else
            {
                Debug.Log("没点击到UGUI上的任何东西");
            }
        }
    }

    //先将cameraMain的当前位置和旋转保存到临时变量Position和Rotation,然后将cameraMain设置为camera2的位置和旋转,最后将camera2恢复为之前保存的Position和Rotation,从而实现视角的互换
    private void CameraLocationExChange(GameObject cameraMain, GameObject camera2)//交换两个相机(cameraMain和camera2)的位置和旋转
    {
        Position = cameraMain.transform.position;
        Rotation = cameraMain.transform.rotation;

        cameraMain.transform.position = camera2.transform.position;
        cameraMain.transform.rotation = camera2.transform.rotation;

        camera2.transform.position = Position;
        camera2.transform.rotation = Rotation;
    }



    /// <summary>
    /// 获得当前点击到的UI物体
    /// </summary>
    public GameObject Skode_GetCurrentSelect()
    {
        GameObject obj = null;

        GraphicRaycaster[] graphicRaycasters = FindObjectsOfType<GraphicRaycaster>();// 查找场景中所有GraphicRaycaster组件

        PointerEventData eventData = new PointerEventData(EventSystem.current);
        eventData.pressPosition = Input.mousePosition;
        eventData.position = Input.mousePosition;// 创建并初始化PointerEventData对象,设置其位置为鼠标光标位置
        List<RaycastResult> list = new List<RaycastResult>();

        foreach (var item in graphicRaycasters)
        {
            item.Raycast(eventData, list);//Raycast方法对UI元素进行射线检测,并将结果存储在list中。如果列表中有检测到的UI元素,将最后一个元素对应的gameObject赋值给obj
            if (list.Count > 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    obj = list[i].gameObject;
                }
            }
        }

        return obj;
    }
}

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

氿 柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值