IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity 物体的拆分与组合及相机绕物体旋转 -> 正文阅读

[游戏开发]Unity 物体的拆分与组合及相机绕物体旋转

?物体拆分和组合

     /// <summary> 此原有距离就是未拆分时子物体位置到旋转物体父节点位置的相对位置 </summary>
    [Header("设置x轴、y轴、z轴需要放大到原有距离的多少倍")]
    [SerializeField]
    private float xMul, yMul, zMul;

    [Header("拆分中心点")]
    [SerializeField]
    private Transform m_CenterPoint;

    [Header("绑定UI")]
    [SerializeField]
    private Button splitBtn;
    private bool isSplit = false;

    [Header("拆分物体父节点")]
    [SerializeField]
    private Transform m_ParObj;//父节点
    private List<Transform> m_Childs = new List<Transform>();//收集全部子节点全部子对象
    private List<Vector3> m_InitPoint = new List<Vector3>();//记录下所有子物体的初始位置

    private void Awake()
    {
        for (int i = 0; i < m_ParObj.childCount; i++)
        {
            m_Childs.Add(m_ParObj.GetChild(i));
        }
        for (int i = 0; i < m_Childs.Count; i++)
        {
            m_InitPoint.Add(m_Childs[i].position);
        }
        splitBtn.onClick.AddListener(SplitBtn);
    }

    /// <summary> 按钮运行 </summary>
    private void SplitBtn()
    {
        if (!isSplit)
        {
            SplitObject();
            splitBtn.transform.GetChild(0).GetComponent<Text>().text = "组合";
        }
        else
        {
            CombineObject();
            splitBtn.transform.GetChild(0).GetComponent<Text>().text = "拆分";
        }
        isSplit = !isSplit;
    }

    /// <summary> 进行拆分 </summary>
    private void SplitObject()
    {
        for (int i = 0; i < m_Childs.Count; i++)
        {
            m_Childs[i].transform.DOMove(SplitObjectPos(m_CenterPoint, m_Childs[i].transform), 0.2f, false);
        }
    }

    /// <summary> 进行组合 </summary>
    private void CombineObject()
    {
        for (int i = 0; i < m_InitPoint.Count; i++)
        {
            m_Childs[i].transform.DOMove(m_InitPoint[i], 0.2f, false);
        }
    }

    /// <summary> 将子物体移动到新位置 </summary> 
    public Vector3 SplitObjectPos(Transform centerPoint, Transform child)
    {
        Vector3 temp;
        temp.x = (child.position.x - centerPoint.position.x) * xMul + centerPoint.position.x;
        temp.y = (child.position.y - centerPoint.position.y) * yMul + centerPoint.position.y;
        temp.z = (child.position.z - centerPoint.position.z) * zMul + centerPoint.position.z;
        return temp;
    }


绑定相机进行绕物体旋转

    [Header("获得旋转目标")]
    [SerializeField]
    private Transform target;//获取旋转目标

    [Header("绑定相机")]
    [SerializeField]
    private Camera camera1;//绑定相机

    public float maxField;//控制相机FieldOfView的最大角度
    public float minField;//控制相机FieldOfView的最小角度


    private void Start()
    {
        //初始化相机面向物体
        camera1.transform.forward = (target.position - camera1.transform.position).normalized;
    }

    private void Update()
    {
        CameraRotate();
        CameraZoom();
    }

    /// <summary> 摄像机围绕目标旋转操作 </summary>
    private void CameraRotate() 
    {
        var mouse_x = Input.GetAxis("Mouse X");//获取鼠标X轴移动
        var mouse_y = -Input.GetAxis("Mouse Y");//获取鼠标Y轴移动
        if (Input.GetKey(KeyCode.Mouse0))
        {
            transform.RotateAround(target.transform.position, Vector3.up, mouse_x * 5);
            transform.RotateAround(target.transform.position,  transform.right, mouse_y * 5);
        }
    }

    /// <summary> 摄像机滚轮缩放(通过修改相机Field Of View的来进行缩放) </summary>
    private void CameraZoom()
    {
        if (Input.GetAxis("Mouse ScrollWheel") > 0 && camera1.fieldOfView > minField)
        {
            camera1.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * 5f;
        }
        if (Input.GetAxis("Mouse ScrollWheel") < 0 && camera1.fieldOfView < maxField)
        {
            camera1.fieldOfView -= Input.GetAxis("Mouse ScrollWheel") * 5f;
        }
    }

转动:?

缩放:


主要API

Transform.RotateAround

public void RotateAround (Vector3 point, Vector3 axis, float angle);

描述:

将变换围绕穿过世界坐标中的?point?的?axis?旋转?angle?度。

这会修改变换的位置和旋转。

Camera.fieldOfView

public float fieldOfView ;

描述:

摄像机的视野(以度为单位)。

Unity API链接:

Transform-RotateAround - Unity 脚本 API

Camera-fieldOfView - Unity 脚本 API

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-16 18:01:25  更:2021-12-16 18:02:08 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:57:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码