unity3D中点击按钮位移镜头到指定物体和鼠标点击物体位移镜头方法

需求

1、点击目标(例cube)镜头位移到距离目标的指定位置
2、点击按钮镜头位移到距离目标的指定位置

前期设置

1、新建一个场景并保存
2、新建三个cube,分别改变位置(0,0,0),(5,0,0),(10,0,0)
3、新建三个材质,分别加到cube上,便于位移效果实现后区分cube
4、新建三个按钮,分别命名为cube1,cube2,cube3,并修改按钮位置和文字
5、将摄像机位置移动到能看见三个cube的位置,我的位置是(5,0,-10)
我的界面状态
6、界面部分就结束了

代码编写

1、新建脚本,命名自己取或者按我的是 MovingFunction

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

public class MovingFunction : MonoBehaviour
{
    //相机
    public Camera cam;
    //相机移动到的点
    Vector3 targetPos;
    //速度
    float speed = 1f;
    //步
    float step;

    //是否点击按钮1
    bool isB1 = false;
    //是否点击按钮2
    bool isB2 = false;
    //是否点击按钮3
    bool isB3 = false;
    //是否鼠标点击物体
    bool isMouseClick = false;
    //镜头移动状态(若当前移动状态为真,为正在移动,则点击其他物体或点击按钮不产生效果)
    bool Moving = false;
    //开始设置步长
    void Start()
    {
        step = (speed * Time.deltaTime);
    }
    //每帧执行
    void Update()
    {
        //发出射线,当点击到物体且镜头非移动状态(Moving==false)时
        //得到该物体坐标,摄像机移动到该物体z轴-10的位置
        //运行射线方法移动函数,位移状态改变为真
        #region 射线
        if (Input.GetMouseButtonDown(0) && Moving == false)
        // if(Input.GetKey(KeyCode.Mouse0))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                //得到鼠标左键点击的物体gameObj
                GameObject gameObj = hitInfo.collider.gameObject;
                //输出物体的位置
                Debug.Log(gameObj.transform.position);
                //输出物体名称
                Debug.Log(gameObj.name);
                //目标点位置
                targetPos = gameObj.transform.position + new Vector3(0, 0, -10);
                //镜头状态改变为移动
                isMouseClick = true;
                Moving = true;
                
            }
        }
        #endregion
        #region 镜头位移到指定位置
        if (isMouseClick) {
            moving_check(targetPos);
        }
        #endregion

        //每增加一个物体,增加一个按钮时,内部的if必须增加,且坐标需
        //要根据物体的位置而写死在移动方法的传参里面,非常不方便
        #region 镜头位移到固定位置

        if (isB1 || isB2 || isB3) {
            if (isB1)
            {
                moving_check(new Vector3(0, 0, -10), ref isB1);
            }
            if (isB2)
            {
                moving_check(new Vector3(5, 0, -10), ref isB2);
            }
            if (isB3)
            {
                moving_check(new Vector3(10, 0, -10), ref isB3);
            }
        }
        

        #endregion

    }
    #region 射线方法到达 到达后关闭移动
    void moving_check(Vector3 v) {
        //摄像机位置移动到v位置
        cam.transform.localPosition = Vector3.MoveTowards(cam.transform.localPosition, v, step);
        //当到达目的地,关闭移动状态
        if (cam.transform.localPosition == v)
        {
            isMouseClick = false;
            Moving = false;
        }
    }
    #endregion
    #region 按钮方法到达 到达后取消移动
    void moving_check(Vector3 v, ref bool b)
    {   //同上
        cam.transform.localPosition = Vector3.MoveTowards(cam.transform.localPosition, v, step);
        if (cam.transform.localPosition == v)
        {
            b = false;
            Moving = false;
        }
    }
    #endregion

    #region 按钮连接的方法,改变指定位移的状态,输出按钮名称
    public void clickButton()
    {   //当移动状态为假时执行
        if (Moving==false) {
            var button = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject;
            //print(button.name);
            switch (button.name)
            {
                case "cube1": isB1 = true;Moving = true; break;
                case "cube2": isB2 = true;Moving = true; break;
                case "cube3": isB3 = true;Moving = true; break;
            }
        }
        
    }
    #endregion

}

2、在场景中新建一个空物体用来挂载脚本(这是好习惯,脚本千万别乱挂),将主摄像机拖拽到脚本的cam里界面
3、运行,应该没有问题,

结语

1、虽然实现了镜头追踪物体的效果,但按钮点击部分源码位置数据都是写死的,所以很麻烦,实现的很笨。
2、没有镜头旋转的内容,仅仅是将镜头移动到固定点,后续将继续研究实现。
3、代码可读性差,虽然在源码中添加了大量注释,但感觉代码写的很乱,虽然已经修改很多次,但是因为没有重构代码的经验,感觉代码看起来思路不清晰。

每添加一个物体一个按钮就要修改源码,实在是一种很笨的实现方法,但作者目前C#和Unity3D的学习处于起步阶段,其中的不足之处还请大家多多指教。如果你和我一样,希望这篇文章能帮你解决一些问题。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐