当前位置:   article > 正文

Unity基础课程之物理引擎4-用于射击或者点击消除的射线检测方法_unity3d射线做点击

unity3d射线做点击

业务逻辑

这段代码实现了一个功能,当玩家按下鼠标左键或按下Q键时,从游戏主角的位置沿着主角的前方方向发射一条射线。如果射线碰撞到了具有Collider触发或碰撞器的游戏物体,则销毁该游戏物体。

程序逻辑

程序的逻辑如下:
1. 在`Start()`函数中,通过标签"Role"找到并存储游戏主角对象。
2. 在`Update()`函数中,每帧获取游戏主角的当前位置和前方方向。
3. 当玩家按下鼠标左键或按下Q键时,进入条件判断
4. 输出日志信息表示射线开始发射。
5. 使用`Physics.Raycast()`函数从主角的位置和方向发射射线,将碰撞结果存储在`RaycastHit`变量`Emeny`中。
6. 如果射线击中了某个游戏物体,打印该游戏物体的名称。
7. 将被击中的游戏物体存储到临时变量`TempOBJ`中。
8. 判断被击中的游戏物体的名称是否为"Role",如果不是则销毁该游戏物体。
9. 使用`Debug.DrawLine()`函数绘制一条红色的线,表示射线的路径(场景编辑器中可见)。
10. 结束条件判断。

场景设计,发射的主体设计的是 Role,并且指定一个标签便于代码获取 !

代码演示 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class StudyRaycast : MonoBehaviour
  5. {
  6. GameObject OneRole; // 一个变量,用来存放游戏主角,发射射线时的主体
  7. public float RayDistance = 55f; // 射线的长度
  8. void Start()
  9. {
  10. OneRole = GameObject.FindGameObjectWithTag("Role"); // 找到并存储标签为"Role"的游戏物体作为主角
  11. }
  12. void Update()
  13. {
  14. Vector3 RoleCurrPosition = OneRole.transform.position; // 主角当前的位置
  15. Vector3 RoleCurrDirection = OneRole.transform.forward; // 主角当前的前方方向
  16. do
  17. {
  18. if (OneRole == null)
  19. {
  20. Debug.Log("没有赋值主角变量OneRole,请检查主角是否指定标签");
  21. break;
  22. }
  23. // 按下鼠标左键或按下Q键
  24. if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Q) || Input.GetKey(KeyCode.Q))
  25. {
  26. Debug.Log("射线开始发射");
  27. RaycastHit Enemy; // 存储射线返回的目标
  28. if (Physics.Raycast(RoleCurrPosition, RoleCurrDirection, out Enemy)) // 从主角的位置和方向发射射线
  29. {
  30. Debug.Log(Enemy.transform.name); // 输出被射线击中的目标的名称
  31. GameObject TempOBJ = Enemy.transform.gameObject;
  32. Debug.Log("射线发射摧毁目标");
  33. if (Emeny.transform.name != "Role") // 如果被射线击中的目标不是主角本身
  34. {
  35. Destroy(TempOBJ); // 销毁被击中的目标
  36. }
  37. }
  38. Debug.DrawLine(RoleCurrPosition, RoleCurrDirection * RayDistance, Color.red);
  39. // 在场景中绘制一条红色的线,用于显示射线的路径(注意:这个线只在编辑器中可见,最终游戏中不会显示)
  40. }
  41. } while (false);
  42. }
  43. }

第二个写法: 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class ShotRay : MonoBehaviour
  5. {
  6. Ray oneRay;
  7. GameObject MainObj;
  8. float RayDistance = 1000f;
  9. // 这个脚本使用来让主角从自己的坐标位置向前方发射射线,如果击中物体,就销毁对方
  10. void Start()
  11. {
  12. MainObj = GameObject.Find("MainRole");
  13. }
  14. void Update()
  15. {
  16. if (Input.GetKey(KeyCode.Space))
  17. {
  18. RaycastHit EnemyObj;//声明一个RaycastHit类型的变量!用来存储射线射到的物体
  19. if (Physics.Raycast(MainObj.transform.position, MainObj.transform.forward, out EnemyObj))
  20. {
  21. Debug.Log("你让我发射的射线,我射到了一个物体,他叫:"+ EnemyObj.transform.gameObject.name);
  22. Destroy(EnemyObj.transform.gameObject);
  23. }
  24. Debug.DrawLine(MainObj.transform.position, MainObj.transform.forward* RayDistance,Color.red);
  25. // 在场景中绘制一条红色的线,用于显示射线的路径(注意:这个线只在编辑器中可见,最终游戏中不会显示)
  26. }
  27. }//end Update
  28. }//end class

向鼠标点击的位置发射射线并且返回物体请看链接:

Unity基础课程之物理引擎4-Unity射线的创建使用_unity 2d自上向下发射射线-CSDN博客

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/101010
推荐阅读
相关标签
  

闽ICP备14008679号