当前位置: 首页 > news >正文

手把手教你写Unity3D飞机大战(6)玩家子弹射击之瞄准程序(射线检测)

一、射线

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray, out hitInfo, 10000f))
{Debug.Log("瞄准物体: " + hitInfo.transform.name);
}

二、发射

我们可以通过射线检测来获取遇到的物体,也可以获取遇到物体的位置。

具体怎么做呢?

我的做法是从射线机往瞄准点打出射线,然后获取射线的碰撞点,再从两侧的发射点向瞄准点发射子弹。

if (Input.GetMouseButton(0) && Time.time - lastTime > 0.1f)
{lastTime = Time.time; // 定时器,每秒最多10发GameObject p1 = GameObject.Find("Player/left"), p2 = GameObject.Find("Player/right");Create(p1.transform.position);Create(p2.transform.position);
}

首先确定框架。

void Create(Vector3 p)
{num++;if (num >= 100)num = 100; // 子弹总数tmp = (tmp + 1) % 100; // 一旦超过100发,循环利用,0会自动忽略GameObject old = GameObject.Find("Bullet"); // 找到原体GameObject nw = null; // 新建子弹if (old != null && num == 100)nw = GameObject.Find("Bullet" + tmp.ToString()); // 循环利用else if (old != null)nw = Instantiate(old); // 新建一个if (nw != null)nw.name = "Bullet" + tmp.ToString(); // 重新命名if (nw != null){// 射线检测Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo, 10000f)){nw.transform.position = p; // 确定发射位置nw.transform.LookAt(hitInfo.point); // 确定子弹朝向}}
}

Create负责创造子弹。

for (int i = 1; i <= num; i++)
{GameObject th = GameObject.Find("Bullet" + i.ToString());if (th != null){th.transform.Translate(0, 0, 2.5f);}
}

子弹的移动。

三、子弹的基础

我们必须有一个原体子弹,这样才能克隆出来。

我把它藏在机场内部,反正不要让玩家看到就好。

四、源码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;public class Shoot : MonoBehaviour
{public int num = 0, tmp = 0;private float lastTime;void Start(){lastTime = Time.time;}void Create(Vector3 p){num++;if (num >= 100)num = 100;tmp = (tmp + 1) % 100;GameObject old = GameObject.Find("Bullet");GameObject nw = null;if (old != null && num == 100)nw = GameObject.Find("Bullet" + tmp.ToString());else if (old != null)nw = Instantiate(old);if (nw != null)nw.name = "Bullet" + tmp.ToString();if (nw != null){Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hitInfo;if (Physics.Raycast(ray, out hitInfo, 10000f)){nw.transform.position = p;nw.transform.LookAt(hitInfo.point);}}}void FixedUpdate(){if (Input.GetMouseButton(0) && Time.time - lastTime > 0.1f){lastTime = Time.time;GameObject p1 = GameObject.Find("Player/left"), p2 = GameObject.Find("Player/right");Create(p1.transform.position);Create(p2.transform.position);}for (int i = 1; i <= num; i++){GameObject th = GameObject.Find("Bullet" + i.ToString());if (th != null){th.transform.Translate(0, 0, 2.5f);}}}
}

本篇文章有点复杂,如果没有看懂,欢迎留言。 


http://www.mrgr.cn/news/69730.html

相关文章:

  • STM32F1学习——PWM波(OC输出比较)
  • 关于 3D Engine Design for Virtual Globes(三维数字地球引擎设计)
  • 机器学习在网络安全中的应用
  • ubontu--cuDNN安装
  • 项目技术栈-解决方案-web3去中心化
  • Vue.js:构建现代 Web 应用的强大框架
  • 平衡二叉树
  • 【含文档】基于ssm+jsp的旅游网站(含源码+数据库+lw)
  • 【数据结构实战】从零开始打造你的专属链表
  • FPGA 第5讲 点亮你的LED灯
  • AI重塑软件开发流程
  • A025-基于SpringBoot的售楼管理系统的设计与实现
  • 【网络安全】Nginx功能快速入门
  • 05_docker 安装常用软件
  • 【GPTs】EmojiAI:轻松生成趣味表情翻译
  • Linux服务器进程的控制与进程之间的关系
  • ReentrantLock【复习】
  • 微服务(二)
  • AI背后的“思考者“:LLM大语言模型是什么?
  • 使用热冻结数据层生命周期优化在 Elastic Cloud 中存储日志的成本
  • 一定要chatgpt吗?
  • 十八:Spring Boot 依赖(3)-- spring-boot-starter-data-jpa 依赖详解
  • 对静态资源加载失败的场景做降级处理
  • 防倒灌电路【手电钻工作日志】
  • 素数筛选法
  • 说说HDD老将的那些事儿