Unity 射线点击 多目标点小地图移动

Unity 射线点击 多目标点小地图移动


整体很简单,只需要简单的搭载使就用就可以了。
废话不多说了 直接上代码。

基本UI展示

总体控制以及相关元素存储
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.IO;

/// <summary>
/// 总控
/// </summary>

public class SubjectController_ZH : MonoBehaviour
{
    /// <summary>
    /// UI 
    /// </summary>
    [SerializeField]
    private Transform _Canvas;

    [Header("小地图UI")]
    public Transform _MapPlane;


    /// <summary>
    /// 外部元素
    /// </summary>



    /// <summary>
    /// Transforme
    /// </summary>

    [Header("主摄像机")]
    [HideInInspector]
    public Transform _CameraMain;


    [Header("位置移动数组")]
    //[HideInInspector]
    public List<GameObject> _ListPostion;
     
    /// <summary>
    /// Other
    /// </summary>
    public static SubjectController_ZH _SubjectController;

    private void Awake()
    {
        单例
        _SubjectController = this;

        Initialized();
    }


    //初始化
    public void Initialized()
    {
        //MainCamera赋值
        _CameraMain = Camera.main.transform;

        //位置移动数组添加
        _ListPostion.AddRange(GameObject.FindGameObjectsWithTag("GameController"));



        //UI 框架处理
        //if (_Canvas.GetComponent<UIManager_ZH>() == null)
        //{
        //    _Canvas.gameObject.AddComponent<UIManager_ZH>();
        //    for (int i = 0; i < _Canvas.childCount; i++)
        //    {
        //        if (_Canvas.GetChild(i).GetComponent<UIscene_ZH>() == null)
        //        {
        //            _Canvas.GetChild(i).gameObject.AddComponent<UIscene_ZH>();
        //        }
        //    }
        //}
    }


    //资源加载
    public void DownLoadImage()
    {
        //资源加载
        //可以加载网络服务器和本地图片
        //string _AudioPlayStr = Application.dataPath + "@/ZH/Image/背景音乐.png";
        //WWW _WWW = new WWW(_AudioPlayStr);
        //yield return _WWW;

        //_AudioPlay = Resources.Load("背景音乐", typeof(Sprite)) as Sprite;

        //AssetBundle.Load("Assets/_Sprites/Setting/" + "背景音乐" + ".png", (sprite) => { _AudioPlay.sprite = sprite; });
    }
}

第一人称代码控制 以及视角限制方法(CameraRotation()) 射线检测移动方法(Move())
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

/// <summary>
/// 自动漫游Camera
/// </summary>
public class Cmaera_ZH : MonoBehaviour
{
    //自动漫游Camera
    private Transform _RoamTransform;

    private Camera _MainCamrea;

    //Camrea 摄像机运动速度
    public float _CmaeraMoveSpeed = 1.5f;

    //上下限制视角
    public float _MinX = -85.0f;
    public float _MaxX = 85.0f;

    //远近视角限制
    public float _FovMin = 40.0f;
    public float _FovMax = 85.0f;

    float _EulerX = 0.0f;
    float _EulerY = 0.0f;
    //自动漫游初始旋转角度
    Quaternion _RoamEuler;

    [HideInInspector]
    public Vector3 _Target;

    public static Cmaera_ZH _MainCamer;
    void Start()
    {
        _MainCamer = this;


        _RoamTransform = SubjectController_ZH._SubjectController._CameraMain;
        _MainCamrea = _RoamTransform.GetComponent<Camera>();
        _RoamEuler = _RoamTransform.rotation;

        _Target = _RoamTransform.position;

        //控制物理是否会改变物体的旋转。
        if (GetComponent<Rigidbody>())
        {
            GetComponent<Rigidbody>().freezeRotation = true;
        }
    }


    void LateUpdate()
    {
        Move();
        CameraRotation();
    }

    //Camera 角度限制方法
    public void CameraRotation()
    {
        if (Input.GetMouseButton(1))
        {
            _EulerY += Input.GetAxis("Mouse X") * _CmaeraMoveSpeed;
            _EulerX -= Input.GetAxis("Mouse Y") * _CmaeraMoveSpeed;

            //角度限制,如果rorationY小于min返回min,大于max返回max
            _EulerX = Clam(_EulerX, _MinX, _MaxX);
            Quaternion _Euler = Quaternion.Euler(_EulerX, _EulerY, 0.0f);
            _RoamTransform.rotation = _RoamEuler * _Euler;
        }

        float _Mouse2 = 0.0f;
        _Mouse2 = Input.GetAxis("Mouse ScrollWheel");
        _MainCamrea.fieldOfView = Clam(_MainCamrea.fieldOfView + _Mouse2 * 5, _FovMin, _FovMax);

    }

    public float Clam(float _Value, float _Min, float _Max)
    {
        if (_Value < _Min)
        {
            return _Min;
        }

        if (_Value > _Max)
        {
            return _Max;
        }
        return _Value;
    }


    /// <summary>
    /// 移动方法
    /// </summary>
    /// <param name="_Target"></param>
    public void Move()
    {
        //点击鼠标
        if (Input.GetMouseButton(0))
        {
            //屏幕坐标转射线
            object _Ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //射线对象是:结构体类型(存储了相关信息)
            RaycastHit _Hit;
            //发出射线检测到了碰撞   isHit返回的是 一个bool值
            bool _IsHit = Physics.Raycast((Ray)_Ray, out _Hit, 1000, LayerMask.GetMask("Click"));
            //EventSystem.current.IsPointerOverGameObject() 鼠标在UI上面
            if (_IsHit && !EventSystem.current.IsPointerOverGameObject())
            {
                //Debug.Log("坐标为:" + _Hit.point);
                //检测到碰撞,就把检测到的点记录下来
                //_Target = _Hit.point;

                //索引点击物体 所在数组的位置
                int _ListPostionNumber = SubjectController_ZH._SubjectController._ListPostion.IndexOf(_Hit.transform.gameObject);
                _Target = SubjectController_ZH._SubjectController._ListPostion[_ListPostionNumber].transform.position;

            }
        }

        ///简写
        //如果检测到当前坐标 与 碰撞的点坐标 距离大于0.1f,就移动碰撞目标的位置 碰撞的点 :_Target   
        _RoamTransform.position = Vector3.Distance(_RoamTransform.position, new Vector3(_Target.x, _RoamTransform.position.y, _Target.z))
            > 0.1f ? Vector3.Lerp(_RoamTransform.position, new Vector3(_Target.x, _RoamTransform.position.y, _Target.z), Time.deltaTime)
            : new Vector3(_Target.x, _RoamTransform.position.y, _Target.z);

        #region 移动方法
        //if (Vector3.Distance(_RoamTransform.position, new Vector3(_Target.x, _RoamTransform.position.y, _Target.z)) > 0.1f)
        //{
        //    _RoamTransform.position = Vector3.Lerp(_RoamTransform.position, new Vector3(_Target.x, _RoamTransform.position.y, _Target.z), Time.deltaTime);
        //}
        如果物体的位置和目标点的位置距离小于 0.1时直接等于目标点
        //else
        //{
        //    _RoamTransform.position = new Vector3(_Target.x, _RoamTransform.position.y, _Target.z);

        //}
        #endregion
    }
}

小地图UI 点击移动方法  调用请自行添加  (可优化 但是没写  哈哈哈)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

/// <summary>
/// 小地图UI 点击移动方法  
/// </summary>


public class MapMove_ZH : MonoBehaviour
{
    //小地图
    [Header("小地图UI")]
    //[SerializeReference]
    private Transform _TraPlane;

    //小地图点击 Button
    //[HideInInspector]
    public List<Transform> _ListButtonPostion;




    private void Start()
    {
        _TraPlane = SubjectController_ZH._SubjectController._MapPlane;

        for (int i = 0; i < _TraPlane.childCount; i++)
        {
            //小地图 点击 Button 数组赋值
            _ListButtonPostion.Add(_TraPlane.GetChild(i));
        }
    }

    //UI 点击上一步移动
    public void MoveMapButtonUP()
    {

        if (SubjectController_ZH._SubjectController._ListPostion != null)
        {
            int _Number = SubjectController_ZH._SubjectController._ListPostion.Count;
            for (int i = 0; i < _Number; i++)
            {

                //检测当前位置 并且 当前位置不是第一个位置
                if (Cmaera_ZH._MainCamer._Target == SubjectController_ZH._SubjectController._ListPostion[i].transform.position && i > 0)
                {
                    //Camera 移动位置赋值
                    Cmaera_ZH._MainCamer._Target = SubjectController_ZH._SubjectController._ListPostion[i - 1].transform.position;

                    break;
                }
            }
        }
    }

    //UI 点击下一步移动
    public void MoveMapButtonDown()
    {
        if (SubjectController_ZH._SubjectController._ListPostion != null)
        {
            int _Number = SubjectController_ZH._SubjectController._ListPostion.Count-1 ; 
            for (int i = 0; i < _Number; i++)
            {
                //检测当前位置
                if (Cmaera_ZH._MainCamer._Target == SubjectController_ZH._SubjectController._ListPostion[i].transform.position)
                {
                    //Camera 移动位置赋值
                    Cmaera_ZH._MainCamer._Target = SubjectController_ZH._SubjectController._ListPostion[i + 1].transform.position;

                    执行Camera 第一人称 移动方法
                    //Cmaera_ZH._MainCamer.Move();

                    //print(i);  

                    break;
                }
            }
        }
    }

    //UI 点击移动
    public void MoveMapButton()
    {

        //获取当前选择的游戏对象
        var _ButtonSelf = UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject;

        if (_ListButtonPostion != null)
        {
            for (int i = 0; i < _ListButtonPostion.Count; i++)
            {
                //检测当前点击的按钮是哪一个
                if (_ButtonSelf.transform == _ListButtonPostion[i])
                {
                    //Camera 移动位置赋值
                    Cmaera_ZH._MainCamer._Target = SubjectController_ZH._SubjectController._ListPostion[i].transform.position;

                    执行Camera 第一人称 移动方法
                    //Cmaera_ZH._MainCamer.Move();


                }
            }

            //print(_ListButtonPostion[0]);
            //print(_ButtonSelf);
        }
    }
}

欢迎交流,虽然我是个小菜鸡,哈哈哈

就酱,与君共勉。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Maddie_Mo

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

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

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

打赏作者

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

抵扣说明:

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

余额充值