Unity 射线点击 多目标点小地图移动
整体很简单,只需要简单的搭载使就用就可以了。
废话不多说了 直接上代码。
总体控制以及相关元素存储
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);
}
}
}
欢迎交流,虽然我是个小菜鸡,哈哈哈
就酱,与君共勉。