Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中
Posted
技术标签:
【中文标题】Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中【英文标题】:Unity3d - Raycast doesnt Count Hit when multiple Colliers are in the scene 【发布时间】:2021-03-26 10:41:01 【问题描述】:private bool InteractCombat()
GameObject target;
RaycastHit[] hits = Physics.RaycastAll(GetMouseRay());
foreach(RaycastHit hit in hits)
if (hit.transform.gameObject.tag == "gameEnemy")
target = hit.transform.gameObject;
else
return false;
if (target == null) return false;
if (target != null)
targetToAttack = target;
targetState = targetToAttack.GetComponent < GameObjectState > ();
;
if (!targetState.IsDead || targetState.CanBeDestroyed)
GetComponent < CursorChanger > ().setCursorToAttack();
enableHealthBarAndAdjustSize();
if (Input.GetMouseButtonDown(0))
GetComponent < Animator > ().ResetTrigger("stopattack");
GetComponent < Attacker > ().Attack(targetToAttack);
else
disableEnemyInfo();
GetComponent < CursorChanger > ().setCursorToWalk();
return true;
return false;
这基本上是我的 PlayerController 脚本中的代码。
场景中有一个敌人,一个碰撞器,一切正常。
当我添加 Enemy Prefab 的第二个克隆时,此处的 Raycast 方法无法找到 GameObject - 当我移除其中一个 Clone 的 Capsule Collider 时,杀死仍然拥有 Collider 的 Remaining Enemy 一切都很好。
我在这里缺少什么?为什么我不能在场景中有多个碰撞器(即使在不同的对象上)而不破坏我的整个攻击功能??。
【问题讨论】:
用适当的缩进粘贴代码 我不能按我的意愿工作:/ 网上有代码美化器,我只用过一个 好吧,你总是在return
的第一个项目上 hits
,所以只有第一个命中是相关的。
您返回true
为点击中未标记gameEnemy
的每个项目.. 请注意顺便说一句,您应该使用CompareTag
而不是直接==
.. 还有一些像if(target == null)
和if(target != null)
这样的冗余检查,一般来说,你应该只检查if(target)
的UnityEngine.Object
类型..
【参考方案1】:
foreach(RaycastHit hit in hits)
if (hit.transform.gameObject.tag == "gameEnemy")
target = hit.transform.gameObject;
else
return false; //Had to be changed to Continue, to not return the function, to try
next element
if (target == null) return false;
if (target != null)
targetToAttack = target;
targetState = targetToAttack.GetComponent < GameObjectState > ();
;
if (!targetState.IsDead || targetState.CanBeDestroyed)
GetComponent < CursorChanger > ().setCursorToAttack();
enableHealthBarAndAdjustSize();
if (Input.GetMouseButtonDown(0))
GetComponent < Animator > ().ResetTrigger("stopattack");
GetComponent < Attacker > ().Attack(targetToAttack);
问题是我把“return false”误认为 “继续”。这种方式只检查了第一个元素,这种方式总是地形。 愚蠢的错误,但由于@Ruzhim 和@derHugo 的回答,我花了很长时间才弄明白
【讨论】:
以上是关于Unity3d - 当场景中有多个 Collier 时,Raycast 不计算命中的主要内容,如果未能解决你的问题,请参考以下文章