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,并且指定一个标签便于代码获取 !

代码演示 


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

public class StudyRaycast : MonoBehaviour
{
    GameObject OneRole;  // 一个变量,用来存放游戏主角,发射射线时的主体
    public float RayDistance = 55f;  // 射线的长度

    void Start()
    {
        OneRole = GameObject.FindGameObjectWithTag("Role");  // 找到并存储标签为"Role"的游戏物体作为主角
    }

    void Update()
    {
        Vector3 RoleCurrPosition = OneRole.transform.position;  // 主角当前的位置
        Vector3 RoleCurrDirection = OneRole.transform.forward;  // 主角当前的前方方向

        do
        {
            if (OneRole == null)
            {
                Debug.Log("没有赋值主角变量OneRole,请检查主角是否指定标签");
                break;
            }

            // 按下鼠标左键或按下Q键
            if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Q) || Input.GetKey(KeyCode.Q))
            {
                Debug.Log("射线开始发射");

                RaycastHit Enemy;  // 存储射线返回的目标
                if (Physics.Raycast(RoleCurrPosition, RoleCurrDirection, out Enemy))  // 从主角的位置和方向发射射线
                {
                    Debug.Log(Enemy.transform.name);  // 输出被射线击中的目标的名称
                    GameObject TempOBJ = Enemy.transform.gameObject;
                    Debug.Log("射线发射摧毁目标");

                    if (Emeny.transform.name != "Role")  // 如果被射线击中的目标不是主角本身
                    {
                        Destroy(TempOBJ);  // 销毁被击中的目标
                    }
                }

                Debug.DrawLine(RoleCurrPosition, RoleCurrDirection * RayDistance, Color.red);
                // 在场景中绘制一条红色的线,用于显示射线的路径(注意:这个线只在编辑器中可见,最终游戏中不会显示)
            }
        } while (false);
    }
}

第二个写法: 

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

public class ShotRay : MonoBehaviour
{

    Ray oneRay;
    GameObject MainObj;
    float RayDistance = 1000f;
    // 这个脚本使用来让主角从自己的坐标位置向前方发射射线,如果击中物体,就销毁对方
    void Start()
    {
        MainObj = GameObject.Find("MainRole");
    }
    
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
           
            RaycastHit EnemyObj;//声明一个RaycastHit类型的变量!用来存储射线射到的物体
            if (Physics.Raycast(MainObj.transform.position, MainObj.transform.forward, out EnemyObj))
            {
                Debug.Log("你让我发射的射线,我射到了一个物体,他叫:"+ EnemyObj.transform.gameObject.name);
                Destroy(EnemyObj.transform.gameObject);
            }
             Debug.DrawLine(MainObj.transform.position, MainObj.transform.forward* RayDistance,Color.red);
            // 在场景中绘制一条红色的线,用于显示射线的路径(注意:这个线只在编辑器中可见,最终游戏中不会显示)

        }

    }//end Update
}//end class

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

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

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Unity3d青子

难题的解决使成本节约,求打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值