Unity实现摄像机向屏幕中间发射射线射击物体

news2024/11/26 17:00:10

1.创建一个准星放在屏幕中间

外部找个PNG透明图,拖到Unity文件夹,右上角改成精灵sprite2d

2.添加到UI画布

 

3.写脚本

首先,我们需要引入一些 "工具",就像我们在玩游戏时要先下载游戏客户端一样。这里的 "工具" 就是一些命名空间,让我们可以方便地使用 System 和 UnityEngine 类。 🔧

接下来,我们创建了一个名为 RayToScreenMid 的 "小玩具"。这个小玩具有一个重要的 "成员"(在程序中,我们称之为变量),那就是 MianCamera。MianCamera 就是我们的 "摄像头",用来观察游戏世界。我们在玩具的 "启动" 阶段(Start 方法)计算了一下屏幕的 "中心位置",并把结果存放在 ScreenMidPos 变量里。 📝

当我们 "玩"(Update 方法)这个小玩具时,如果鼠标左键被按下,RayShot 方法就会被调用。RayShot 方法就像我们在玩游戏时按下的 "射击" 键,它会从 MianCamera(摄像头)出发,向屏幕中间发射一条 "射线"(Ray)。 🎯

然后,我们使用 Physics.Raycast 方法来检查这条射线是否与游戏中的其他物体 "相撞" 了。如果相撞,我们会检查这个物体是不是 "地形" 或者 "角色",如果不是,我们就会 "消灭"(Destroy)这个物体。 🚀

此外,我们还会在游戏中画出一条从 MianCamera(摄像头)到屏幕中间位置的红色射线。这样,我们就可以清楚地看到这条射线,就像我们在玩游戏时看到的 "血条" 一样。 🎭

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

public class RayToScreenMid : MonoBehaviour
{
    // 从视角摄像机向屏幕中间发射射线

    Camera MianCamera;                // 这是一个摄像机对象
    Vector3 ScreenMidPos;             // 这是屏幕中央的点的坐标

    private void Start()
    {
        ScreenMidPos = new Vector3(Screen.width / 2, Screen.height / 2, 0);  // 初始化屏幕中央的点的坐标
    }
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RayShot();              // 如果鼠标左键按下,则发射一条射线
        }
    }

    private void RayShot()
    {
        //从摄像机出发向屏幕中间发射射线!    
        Ray OneShotRay = Camera.main.ScreenPointToRay(ScreenMidPos);          // 以屏幕中央点为原点,发射射线
        RaycastHit OnEnemy;
        if (Physics.Raycast(OneShotRay,out OnEnemy))                          // 如果射线碰到了物体
        {
            Debug.Log("射线发射成功");
            if (OnEnemy.transform.name!= "Terrain"&& OnEnemy.transform.name != "Role")  // 如果碰到的不是地形和角色
            {
                Destroy(OnEnemy.transform.gameObject);                        // 销毁碰撞到的物体
                Debug.Log("销毁对方");
                if (ScreenMidPos != null)
                {
                    Debug.DrawLine(Camera.main.transform.position, ScreenMidPos, Color.red, 10000f);    // 画一条从摄像机出发,到屏幕中央点的射线
                }
               
        }
    }
 
}//end class

这个脚本挂载到哪里都可以,为了符合面向对象,请挂在摄像机或者主角身上

这个脚本是从摄像机往电脑屏幕中间发射射线!前面的UI仅仅只是一个标识!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1092757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python】Python语言基础(中)

第十章 Python的数据类型 基本数据类型 数字 整数 整数就是整数 浮点数 在编程中,小数都称之为浮点数 浮点数的精度问题 print(0.1 0.2) --------------- 0.30000000000000004 ​​1.可以通过round()函数来控制小数点后位数 round(a b),则表示…

华为云云耀云服务器L实例评测|华为云耀云服务器L实例启动宠物预约项目(九)

十、修改配置文件,启动宠物预约项目: 上面步骤进行了程序的安装,接下来就需要对相关程序的配置进行修改,如修改PHP-FPM的运行方式,增加nginx的配置文件,修改Laravel的配置文件。 1. 修改PHP-FPM的配置&…

【LeetCode: 136. 只出现一次的数字 | 位运算 - 异或】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

git强制删除本地分支 git branch -D

git强制删除本地分支 git branch -D git删除本地分支_zhangphil的博客-CSDN博客git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字&#xff0c;然后删除特定分支。https://blog.csdn.net/zhangphil/article/details/82255002 使用git branch -d删除…

网络工程师知识点3

41、各个路由协议&#xff0c;在华为设备中的优先级&#xff1f; 直连路由 0 OSPF 10 静态 60 42、OSPF&#xff1a;开放式最短路径优先路由协议&#xff0c;使用SPF算法发现和计算路由 OSPF的优点&#xff1a; 1、收敛速度快&#xff0c;无路由自环&#xff0c;适用于大型网络…

Arduino驱动BNO055 10轴绝对定向传感器(惯性测量传感器篇)

目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 BNO055是实现智能9轴绝对定向的新型传感器IC,它将整个传感器系统级封装在一起,集成了三轴14位加速度计,三轴16位陀螺仪,三轴地磁传感器和一个自带算法处理的32位微控制器。

Qtcreator console 中文 乱码

开发环境&#xff1a;windows11 x64 位&#xff1b;Qt Creator 11.0.3&#xff1b;Based on Qt 6.4.1 (MSVC 2019, x86_64) 报错内容如图所示&#xff1a; 解决方法如下&#xff1a;

关于EEGLAB安装时报错“未定义函数或者变量‘EEGLAB’”

按照其他博主写的&#xff0c;下载EEGLAB&#xff08;最新版&#xff09;&#xff0c;然后解压&#xff0c;打开matlab&#xff08;2019a&#xff09;导入路径&#xff0c;在前述步骤都正确的情况下&#xff0c;命令行输入eeglab&#xff0c;matlab提示"未定义函数或者变量…

SQL标识列实现自动编号的步骤和技巧以及优势

目录 前言: 过程: 1.步骤: 2.标识种子和表示增量: 效果展示:​ 优势: 总结: 前言: 在.NET中的例子里面遇到这么一个问题&#xff0c;不能将NULL插入列‘ID’&#xff0c;表Login.dbo.Scores’;列不允许有NULL值。INSERT失败。这个问题很明显&#xff0c;我在SQL数据库中…

armbian 系统下 arm小盒子上 尝试跑SRS

1.github国外的太慢了 找了个国内yuan git clone https://gitee.com/ossrs/srs.git2.进到trunk目录 ./configure && make 提示要安装tclsh 那就安装下 还要安装cmake apt install -y cmake 然后有提示安装pkg-config apt install pkgconf cpu arm64 4核 S905…

通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新

通过代码MyBatis-plus实现对表中createTime和updateTime进行自动更新 实现这样的效果可以在数据库中设置&#xff0c;但是我们一般建议在代码里实现&#xff0c; 但是总不能每次insert和update的时候都手写new当前时间 因此推荐使用mybatis-plus 1导入依赖 <dependency&g…

Leetcode 75——1768.交替合并字符串 解题思路与具体代码【C++】

一、题目描述与要求 1768. 交替合并字符串 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你两个字符串 word1 和 word2 。请你从 word1 开始&#xff0c;通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长&#xff0c;就将多出来的字母追加到合并后字符…

springboot 智慧生活商城系统

liu1113625581 springboot 智慧生活商城系统

最新ai创作系统CHATGPT系统源码+支持GPT4.0+支持ai绘画(Midjourney)

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统&#xff0c;支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

【RTOS学习】精简RTOS源码 | 认识RTOS | 任务的创建和删除

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 在前面对ARM架构以及C语言在单片机中的表现有一个简单的认识后&#xff0c;现在开始正式进入RTOS的…

Python技能树练习——统计词频

请编写一段单词统计Python代码&#xff0c;统计下面两个Python三引号字符串里英文单词的词频。要求&#xff1a; 单词请忽略大小写 使用数组splits [\n, , -, :, /, *, _, (, ), ", ”, “,],[]来切割单词 输出词频最高的5个单词和词频信息 * Python 代码风格指南,* [g…

java springboot通过EnableConfigurationProperties全局声明bean并处理装配

Spring Boot中 我们想条件装配一个类 首先 我们要声明他的bean 而 EnableConfigurationProperties 可以直接将 要全局声明的类绑定在 属性类中 例如 我们随便创建一个类 就叫 textData 吧 参考代码如下 package com.example.webdom.domain;import org.springframework.boot.co…

【数据库系统概论】第六章关系数据理论

一句话&#xff0c;研究关系数据库理论就是为了设计出合适的关系模式&#xff0c;也即合适、高效的表 6.1为什么研究关系数据理论 一&#xff1a;概念回顾&#xff1a;关系模式 关系模式&#xff1a;关系模式就是对关系的描述&#xff0c;可以表示为 R ( U , D , D O M , F…

C++指针解读(4)-- 指针和数组(一维数组)

1、数组及数组的访问 1.1 数组的存储方式 在内存中&#xff0c;数组是一块连续的区域。数组的存储结构有如下特点&#xff1a; &#xff08;1&#xff09;数组中的元素是同质的数据&#xff1b; &#xff08;2&#xff09;索引从0开始&#xff1b; &#xff08;3&#xff…

数据库安全-H2 databaseElasticsearchCouchDBInfluxdb漏洞复现

目录 数据库安全-H2 database&Elasticsearch&CouchDB&Influxdb 复现influxdb-未授权访问-jwt 验证H2database-未授权访问-配置不当CouchDB-权限绕过配合 RCE-漏洞CouchDB 垂直权限绕过Couchdb 任意命令执行 RCE ElasticSearch-文件写入&RCE-漏洞Elasticsearch写…