文档章节

【原创】Unity3D 获取鼠标点击或者摄像机视野内的对象

MrBlack
 MrBlack
发布于 2015/07/27 12:44
字数 535
阅读 142
收藏 0

在平时的 Unity 开发过程中,我们经常会需要检测鼠标点击的对象信息(我们通常采用射线检测),或者是摄像机内的对象信息(比如角色视野内的怪物对象等),为此整理出了 PhysisUtils 类库,这样我们就可以快速、方便的进行项目开发!

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

public class PhysisUtils
{
	/// <summary>
	/// 获取鼠标点下的第一个 T 类型对象
	/// </summary>
	/// <returns>The game object by mouse point.</returns>
	/// <param name="camera">Camera.</param>
	/// <typeparam name="T">The 1st type parameter.</typeparam>
	public static T GetTByMousePoint<T>(Camera camera) where T :Component
	{
		Ray ray = camera.ScreenPointToRay (Input.mousePosition);
		RaycastHit raycastHit;
		if (Physics.Raycast (ray, out raycastHit)) 
		{
			GameObject gameObject = raycastHit.transform.gameObject;
			return gameObject.GetComponent<T>();
		}
		return null;
	}

	/// <summary>
	/// 获取鼠标点下的所有的 T 类型对象
	/// </summary>
	/// <returns>The T list by mouse point.</returns>
	/// <param name="camera">Camera.</param>
	/// <typeparam name="T">The 1st type parameter.</typeparam>
	public static IList<T> GetTListByMousePoint<T>(Camera camera) where T:Component
	{
		Ray ray = camera.ScreenPointToRay (Input.mousePosition);
		return FilterTListByRaycastHit<T> (Physics.RaycastAll (ray));
	}

	/// <summary>
	/// 获取对象前面一定距离内所有 T 类型对象
	/// </summary>
	/// <returns>The T list by direction and distance.</returns>
	/// <param name="transform">Transform.</param>
	/// <param name="distance">Distance.</param>
	/// <typeparam name="T">The 1st type parameter.</typeparam>
	public static IList<T> GetTListByDirectionAndDistance<T>(Transform transform, float distance) where T:Component
	{
		if (transform == null) return null;

		Vector3 forward = transform.TransformDirection (Vector3.forward);
		return FilterTListByRaycastHit<T>(Physics.RaycastAll (transform.position, forward, distance));
	}

	/// <summary>
	/// 获取对象前面一定角度以及一定距离内的所有 T 类型对象
	/// </summary>
	/// <returns>The T list by direction and distance and angle.</returns>
	/// <param name="transform">Transform.</param>
	/// <param name="distance">Distance.</param>
	/// <param name="angle">Angle.</param>
	/// <typeparam name="T">The 1st type parameter.</typeparam>
	public static IList<T> GetTListByDirectionAndDistanceAndAngle<T>(Transform transform, float distance, float angle = 0f) where T:Component
	{
		if (transform == null) return null;

		Collider[] colliderList = Physics.OverlapSphere (transform.position, distance);
		if (colliderList == null || colliderList.Length == 0) return null;

		IList<T> resultList = new List<T> ();

		foreach(Collider collider in colliderList)
		{
			GameObject gameObject = collider.gameObject;
			if(gameObject != null)
			{
				if(angle > 0f)
				{
					float targetAngle = Vector3.Angle(gameObject.transform.position - transform.position, transform.forward);
					if(targetAngle > angle)
					{
						continue;
					}
				}
				T t = gameObject.GetComponent<T>();
				if(t != null) resultList.Add(t);
			}
		}
		return resultList;
	}

	/// <summary>
	/// 筛选 T 类型对象
	/// </summary>
	/// <returns>The T list by raycast hit.</returns>
	/// <param name="raycastHitList">Raycast hit list.</param>
	/// <typeparam name="T">The 1st type parameter.</typeparam>
	private static IList<T> FilterTListByRaycastHit<T>(RaycastHit[] raycastHitList) where T:Component
	{
		if (raycastHitList == null || raycastHitList.Length == 0) return null;
		
		IList<T> resultList = new List<T> ();
		
		foreach (RaycastHit raycastHit in raycastHitList) 
		{
			GameObject gameObject = raycastHit.transform.gameObject;
			if(gameObject != null)
			{
				T t = gameObject.GetComponent<T>();
				if(t != null) resultList.Add(t);
			}
		}
		return resultList;
	}
}


© 著作权归作者所有

MrBlack
粉丝 0
博文 14
码字总数 11101
作品 0
闸北
高级程序员
私信 提问
Unity3D——学习分享(一) 游戏开发

自学游戏开发也有一段时间了,很早就想把自己所学到的知识做个笔记总结一下,但因为种种的原因一直没能坚持下来,所以现在我打算现在开始把我学到的内容总结下来,主要的目的是: 把自己的所...

记忆中的戈壁滩
2018/11/22
0
0
Hierarchy视图里的Transform和Camera组件

Hierarchy视图里的Transform和Camera组件 在Hierarchy视图里,选中Camera,然后在Inspector视图里查看其各组件,如图1-8所示。对于Transform和Camera组件,对于使用过Unity的读者来说再熟悉不...

大学霸
2015/04/10
72
0
Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收(九)

Unity3D 游戏引擎之IOS高级界面发送消息与Unity3D消息的接收 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6926746 ...

彭博
2012/03/09
799
0
【U3D入门小白教程——案例篇】之一:球吃豆

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/74558687 个人学习第一章节:球吃豆 1.初入Unity3d,作为新手的我们第一步当然是登录...

唐三十胖子
2017/07/06
0
0
Unity3D 游戏引擎之控制模型移动旋转与碰撞(七)

Unity3D 游戏引擎之控制模型移动旋转与碰撞 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6901154 上一章介绍了模型的...

彭博
2012/03/09
467
0

没有更多内容

加载失败,请刷新页面

加载更多

CQRS与AXON

CQRS 看了蛮多文章,只会CRUD,却不懂CQRS,CQRS是遵循DDD思想而产生的一种模式,Command and Query Responsibility Segregation 命令与查询隔离。查询就直接通过正常的模式service调dao层。...

无极之岚
17分钟前
2
0
OSChina 周三乱弹 —— 欢迎你来做产品经理

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @巴拉迪维 :10多次劲歌金曲获奖,更多叱咤歌坛排名,黎明才应该是四大天王之首,只可惜拍的电影太少。单曲循环一个多月的歌,力荐 《无名份的...

小小编辑
31分钟前
37
2
500行代码,教你用python写个微信飞机大战

这几天在重温微信小游戏的飞机大战,玩着玩着就在思考人生了,这飞机大战怎么就可以做的那么好,操作简单,简单上手。 帮助蹲厕族、YP族、饭圈女孩在无聊之余可以有一样东西让他们振作起来!...

上海小胖
今天
8
0
关于AsyncTask的onPostExcute方法是否会在Activity重建过程中调用的问题

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/XG1057415595/article/details/86774575 假设下面一种情况...

shzwork
今天
7
0
object 类中有哪些方法?

getClass(): 获取运行时类的对象 equals():判断其他对象是否与此对象相等 hashcode():返回该对象的哈希码值 toString():返回该对象的字符串表示 clone(): 创建并返此对象的一个副本 wait...

happywe
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部