Unity3d使用鼠标点击控制人物走动无效的问题

Unity3d使用鼠标点击控制人物走动无效的问题

最近在自学Unity3d,在学到使用鼠标点击控制人物走动时,按照API上面将代码写好,如下:

void Update () {

	//	_clickListener.Update();

		if (Input.GetMouseButtonUp (0)) {
  
			ClickOn(Input.mousePosition);
		}

	}

void ClickOn(Vector2 pos)
	{
		if (player == null)
			return;
		Ray ray = this.GetComponent<Camera>().ScreenPointToRay(pos);
		RaycastHit[] hits = Physics.RaycastAll(ray);

	
		foreach (RaycastHit hit in hits){
			BoxCollider bc = hit.collider as BoxCollider;
            Debug.Log("bc.name is " + bc.name);
            Debug.Log("bc.name is Contains floor  " + bc.name.Contains("floor"));
			if (bc != null && bc.name.Contains("floor") && player != null){
             
			player.GetComponent<Player>().WalkTo(hit.point);
				break;
			}
		}
	}

检查下,没什么错误,Unity3d,点击运行,满以为接下来可以美滋滋的用鼠标控制人物走动了,想想还有点小激动呢!结果点击鼠标,毫无响应!!!!

what fuck?

代码咋回事?写错了吗,于是又反复的检查了一下代码,确认是没问题的。代码既然是没问题,但是又没有达到相应的功能,到底怎么回事呢?

遇到这样的情况第一想到的是肯定是有哪段代码没有执行,从以上代码来看,只有3个地方涉及到了判断逻辑,分别是:if (Input.GetMouseButtonUp (0)) 和foreach (RaycastHit hit in hits) 以及 if (bc != null && bc.name.Contains(“floor”) && player != null)。

先说第一个if (Input.GetMouseButtonUp (0)) :
这是用来判断是否点击了鼠标左键的判断,如果鼠标左键被点击,那么Input.GetMouseButtonUp (0)返回的则是true;
在以上的代码上的对应地方加上打印,最终代码如下:

if (Input.GetMouseButtonUp (0)) {
            Debug.Log("the Mouse button has been press");
			ClickOn(Input.mousePosition);
		}

OK,运行,鼠标左键点击,发现Unity控制台打印为:

在这里插入图片描述


确实收到了鼠标的点击事件,那么确认第一个判断正确的可以pass掉,接下来看第二个逻辑foreach (RaycastHit hit in hits)
这句逻辑是用从射线碰撞点的数组中(具体可以百度)进行遍历的数组,在foreach (RaycastHit hit in hits) 里面加个打印,如下:

foreach (RaycastHit hit in hits){
            Debug.Log("hits has been in ");
			BoxCollider bc = hit.collider as BoxCollider;
          
            Debug.Log("bc.name is Contains floor  " + bc.name.Contains("floor"));
			if (bc != null && bc.name.Contains("floor") && player != null){
             
			player.GetComponent<Player>().WalkTo(hit.point);
				break;
			}
		}

运行,没有执行打印。所以说明foreach语句里面的循环没有被执行,所以说明hits的数组长度为0.
再看:

   Ray ray = this.GetComponent<Camera>().ScreenPointToRay(pos);
    		RaycastHit[] hits = Physics.RaycastAll(ray);

如果hits长度为0,则只能说明 Physics.RaycastAll(ray);拿到的数据为空。
为什么这句会拿到空,首先了解Physics.RaycastAll(ray)该方法return一个数组。ray代表射线,即拿到射线上的所有碰撞点,如果获取的数组为0.则毫无意义是因为没有碰撞器造成的。
搞明白这个问题后,继续回去检查GameObject的Component看有没有添加碰撞器。果然还没加,是这样的:

在这里插入图片描述


没有加就加一个,点击“Add Component” 加一个,如下图:

在这里插入图片描述


添加好之后,保存。继续运行,点击鼠标还是不动。。。。,几乎要放弃的,但是程序员有程序员的倔强。之前两个都解决了,所以再检查第三个 if (bc != null && bc.name.Contains(“floor”) && player != null),继续加Debug日志,发现bc.name.Contains(“floor”)这一句一直返回false,说明碰撞点的对象名字不包含"floor"。找到对应的gameObject,如下图:

在这里插入图片描述


默认的名字都不含有"floor",好吧 改名字呗!不用全部改,只用将地板的模型gameObject改成含有"floor"即可,比如我的,就只改了3个:

在这里插入图片描述


改完之后,运行,完美,可以走动了!

在这里插入图片描述

在这里插入图片描述


第一次写CSDN还不会传动态度,呵呵!
最后说一下,这些素材的都是从网上下载下来导入到工程里面的,里面很多默认的东西没有创建或改名,刚学习接触Unity3d,跟着教程视频,视频讲解老师略过了一些步骤后,就会发现自己没法实现视频上的效果,唉。。。没基础就是不行,好在有因为有其他编程语言的基础,有程序员的职业技能,哈哈,不错就是调试。emmm,仅以此文献给在编程领域摸滚打爬的程序员们,共勉!!!

原文地址:https://blog.csdn.net/qq_34888164/article/details/89213972

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


这篇文章将为大家详细讲解有关Unity3D中如何通过Animator动画状态机获取任意animation clip的准确播放持续时长,小编觉得挺实用的,因此分享给大家做个参考,
这篇文章主要介绍了Unity3D如何播放游戏视频,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解
这篇文章给大家分享的是有关Unity3D各平台路径是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、Resources路径 Reso...
小编给大家分享一下Unity3D如何实现移动平台上的角色阴影,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!由于目前主流使用Unity3.x在移动平...
如何解析基于Unity3D的平坦四叉树地形与Virtual Texture的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希
这篇文章主要介绍Unity3D如何实现动态分辨率降低渲染开销,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!之前项目降低分辨率我们都普...
这篇文章主要介绍了unity3d中如何使用屏幕空间改善shadowmap漏光,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编...
这篇文章主要介绍unity3d如何实现基于屏幕空间的描边,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Outline(Based on Image Space)由...
这篇文章给大家分享的是有关unity3d中导入fbx时的Scale是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。在Unity中点击GameOb...
这篇文章主要为大家展示了“unity3d中如何实现ttc转ttf及制作字体”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习
这篇文章主要介绍了unity3d中水彩风渲染有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了...
这篇文章将为大家详细讲解有关unity3d中图像压缩原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 图像可压缩...
这篇文章给大家分享的是有关unity3d中光照公式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。漫反射、高光、物理渲染(PBR...
小编给大家分享一下unity3d中光照探针的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我...
这篇文章将为大家详细讲解有关Unity3D中Rendering Paths及LightMode的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有
这篇文章将为大家详细讲解有关unity3d中图形学的光照原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。首先,在...
这篇文章给大家分享的是有关unity3d中图片渲染流程是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。相关名词GPU(Graphic Pr...
本篇我们来介绍一下左侧工具栏中基本绘制的应用。 一、墙体绘制直墙 & 矩形墙绘制墙体时,可以看到上方的工具栏中对墙体进行参数的设定。 弧形墙在建筑版的户...
xlua是由腾讯维护的一个开源项目,我们可以在github上下载这个开源项目并查看一些相关文档官网:https://github.com/Tencent/xLua配置文档:https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/hotfix.md常见问题解答:https://github.com/Tencent/xLua/blob/master/Assets/
我们都知道,一个三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于贴图,可见贴图在画面中所占的重要性。在这里我将列举一些贴图,并且初步阐述其概念,理解原理的基础上制作贴图,也就顺手多了。我在这里主要列举几种UNITY3D中常用的贴图,与大家分享,希望对大家有帮助。01 首先