👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:unity每日一记
⭐🅰️推荐文章⭐
⭐【软件设计师高频考点暴击】
⭐⭐
- 在csgo中我们可以看到有很多玩家喜欢用弹道来画画,那么其实本质上呢开枪这个行为并没有发射了子弹,而是我们利用了射线检测碰撞相关和但行特效以及开火特效实现的这样一个效果
- 从而优化了性能减省了资源消耗
那么具体是怎么实现的呢我们往下看
—
🎶(A) 😶🌫️步骤实现:
🎶(B) 😶🌫️ 脚本代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//-------------------------------------
//—————————————————————————————————————
//___________项目: ______________
//___________功能: 弹痕作画的原理
//___________创建者:秩沅_______________
//_____________________________________
//-------------------------------------
public class shootRay : MonoBehaviour
{
private Ray shootray;
private RaycastHit wall;
public Transform shootPosition;
public GameObject shootEffect; //开火特效
public GameObject wallEffect; //弹道特效
private void Update()
{
//1.鼠标点击屏幕实现视口坐标向Ray射线坐标转换
if (Input.GetMouseButtonDown(0))
{
shootray = Camera.main.ScreenPointToRay(Input.mousePosition);
//在开火点的位置上生成开火特效
Instantiate(shootEffect, shootPosition.position , Quaternion.identity);
}
if(Physics.Raycast(shootray, out wall, 1000, 1 << LayerMask.NameToLayer("Wall")))//碰到对象返回true
{
//在碰撞点的位置上生成弹道特效
Instantiate(wallEffect, wall.point, Quaternion.identity);
}
}
}
🎶(c) 😶🌫️ 实现效果
🎶(O)😶🌫️Ray射线检测相关知识点
-
特点
只需要判断一条线和物体的碰撞情况
可以在指定点发射一个指定方向的射线
判断该射线与哪些碰撞器相交,得到对应对象
瞬时 -
应用场景
1.鼠标选择场景上一物体
2.FPS射击游戏(无弹道-不产生实际的子弹对象进行移动)等
API
- Ray X = new Ray(Vector3.right, Vector3.forward);
参数一 | 参数二 |
---|---|
起点 | 方向 |
X.origin | X.direction |
-
Ray XX = Camera.main.ScreenPointToRay(Input.mousePosition);
屏幕视口坐标转成射线——鼠标点击的地方变成射线 -
Physics.Raycast 无法检测碰到了谁,只会检测碰到了没有
最多有16个重载
Physics.Raycast常用参数 | 作用 |
---|---|
参数一 | 射线 |
参数二 | 检测的最大距离 超出这个距离不检测 |
参数三 | 检测指定层级(不填检测所有层) |
参数四 | 是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal |
返回值 | bool 当碰撞到对象时 返回 true 没有 返回false |
//第一种写法
Physics.Raycast(XX, 1000,
1 << LayerMask.NameToLayer("层级名字"),
QueryTriggerInteraction.UseGlobal )
//第二种写法
Physics.Raycast(Vector3.right, Vector3.forward,
1 << LayerMask.NameToLayer("层级名字"),
QueryTriggerInteraction.UseGlobal )
-
RaycastHit 物体信息类——得到相交的单个物体物理信息
RaycastHit 在Physics.Raycast的应用 | 作用 |
---|---|
参数一 | 射线 |
参数二 | out RaycastHit 为什么是out ?RaycastHit是结构体 是值类型 out加上去就变成了引用类型,而RaycastHit没有复制所以不用ref |
参数三 | 检测的最大距离 超出这个距离不检测 |
参数四 | 检测指定层级(不填检测所有层) |
参数五 | 是否忽略触发器 UseGlobal-使用全局设置 Collide-检测触发器 Ignore-忽略触发器 不填使用UseGlobal |
返回值 | bool 当碰撞到对象时 返回 true 没有 返回false |
//写法一
RaycastHit YY;
if( Physics.Raycast(XX, out YY, 1000,
1<<LayerMask.NameToLayer("层级名字"),
QueryTriggerInteraction.UseGlobal) )
//写法二
if( Physics.Raycast(Vector3.right, Vector3.forward, out YY, 1000,
1<<LayerMask.NameToLayer("层级名字"),
QueryTriggerInteraction.UseGlobal) )
- 碰撞到物体的名字 YY.collider.gameObject.name;
- 碰撞到的点 YY.point
- 法线信息 YY.normal
- 碰撞到对象的位置 YY.transform.position
- 碰撞到对象 离自己的距离 YY.distance等等
- RaycastHit[] XX= Physics.RaycastAll——得到相交的多个物体物理信息
特点: 先碰到的在数组的后面
- Physics.RaycastNonAlloc——返回的碰撞的数量 通过out得到数据
if((r3, XX, 1000, 1 << LayerMask.NameToLayer("Monster"),
QueryTriggerInteraction.UseGlobal) > 0 )
{
}
【Unity每日一记】模仿FPS射击,用弹痕作画的原理如此简单
【Unity每日一记】拖拽放置类游戏的行为原来和这个API有关
⭐🅰️系统路线学习点击跳转⭐
⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、文章来源:https://www.toymoban.com/news/detail-689058.html
文章来源地址https://www.toymoban.com/news/detail-689058.html
到了这里,关于【Unity每日一记】模仿FPS射击,用弹痕作画的原理如此简单的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!