业务逻辑
这段代码实现了一个功能,当玩家按下鼠标左键或按下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
向鼠标点击的位置发射射线并且返回物体请看链接: