赞
踩
这段代码实现了一个功能,当玩家按下鼠标左键或按下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);
- }
- }
-
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
- 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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
向鼠标点击的位置发射射线并且返回物体请看链接:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。