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


    业务逻辑

    这段代码实现了一个功能,当玩家按下鼠标左键或按下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博客

  • 相关阅读:
    TypeScript 介绍和开发环境搭建
    学生成绩管理程序: 用面向对象的方法
    隆云通空气温湿、CO、PM2.5、PM10五参数
    请求数据时,后端返回的状态码
    MODNet:基于目标分解的实时trimap-free肖像抠图
    Linux配置腾讯云yum源(保姆级教学)
    面试算法35:最小时间差
    Java8新特性--新的时间和日期API
    线性代数学习笔记7-1:特征值、特征向量、迹、特征基
    杭州市IT行业人才需求地图信息系统的设计与实现
  • 原文地址:https://blog.csdn.net/leoysq/article/details/133746789