Unity学习(day01)向敌人发射子弹,敌人有AI漫游效果

Unity3D通过射线检测实现子弹射击 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 关于射线检测实现子弹射击效果 1、射线检测 2、实现子弹发射的效果 3、拓展(FPS游戏进场开始游戏选择) (1)射线检测与组件LineRenderer的使用 (2)优化 一、射线检测是什么? 射线检测是指通过发出一条射线,对射线碰撞到的碰撞体进行检测,发生碰撞满足条件时返回值为真。 其中包括: 1、Physics.Linecast 线性投射:开始位置到结束位置进行光线投射 2、Physics... 阅读详情

目录

一.内容以及步骤:

1.编写代码允许玩家向场景发射

2.敌人被击中的简单后仰效果,以及敌人AI漫游

二.效果预览:

1.玩家向场景发射效果:

2.敌人被击中的简单后仰效果

3.敌人AI漫游效果

三.实现步骤:

1.步骤

 (1)创建一个RayShooter脚本,附加到摄像机上

(2)RayShooter脚本内容:

(3) 敌人类:

2.敌人受攻击倾斜效果

3.敌人AI漫游实现

持续更新!感兴趣记得关注哦


一.内容以及步骤:


1.编写代码允许玩家向场景发射

        ①shoot方法,从摄像机的中心发射射线,将碰撞点作为射击点,产生一个小球,其实就是在碰撞点的位置生成一个sphere就有这种效果了

        ②OnGUI方法相当于创建最上层图层,类似贴纸,用来当准心

2.敌人被击中的简单后仰效果,以及敌人AI漫游

        ①当被子弹击中时,产生后仰,直接在子弹发生碰撞时进行检测,检测成功直接使碰撞物体倾倒。(利用rotate方法即可简单实现)

        ②敌人呆呆的在原地没有意思,这里用一种简单的方法来实现敌人漫游:移动很简单,直接使用translate就可以。但是怎样让它遇到墙自己转向呢?就是从敌人处发射射线,射线里包含很多信息包括发生碰撞的距离,当检测到距离过小时,也就是要撞墙了,此时产生一个随机的角度,利用rotate方法给它一个旋转就行了。

二.效果预览:

1.玩家向场景发射效果:

如图所示,从摄像机中心发射射线,射线如果与敌人发生碰撞则发射一个球模拟子弹

2.敌人被击中的简单后仰效果

 

3.敌人AI漫游效果

 

 

三.实现步骤:

1.步骤

 (1)创建一个RayShooter脚本,附加到摄像机上

(2)RayShooter脚本内容:

shoot()方法实现:

private void shoot()
    {
        //_camera.enabled = false;理解GetComponent小例子
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 point = new Vector3(_camera.pixelWidth / 2, _camera.pixelHeight / 2, 
            0);//获取摄像机屏幕中心坐标
            Ray ray = _camera.ScreenPointToRay(point);//ScreenPointToRay()返回从摄像机通过 
                     屏幕点的光线,也就是产生一个
                                                      //ray对象,而不是Object对象
                                                      //Debug.DrawRay(ray.origin, 
            ray.direction * 10, Color.black);
            RaycastHit hit;//RaycastHit关于射线交叉信息的包装,包括哪里交叉和与哪个对象发生 
                            交叉
            if (Physics.Raycast(ray, out hit))//Physics.Raycast():射线投射 类似于从空间中 
                                                的某个点朝特定方向发射一条光束。
                                              //在该过程中,可以检测并报告与光束接触的任何对 
                                                  象
                                              //out关键字,使一个数据结构在命令内操作和命令 
                                                外都是同一对象而不是,
                                              //那些在不同函数作用域中被反复复制的对象
            {
                GameObject hitObject = hit.transform.gameObject;//获取碰撞对象
                //击中信息不会返回击中对象,而是指向所击中的Transform组件,所以可以通过 
                  Transform来访问gameObject
                //使用对象的GetComponent方法检查它是否是一个反应的目标(如果有ReactiveTarget 
                   就是)
                //GetComponent()方法返回附加到GameObject上的指定类型组件,如果对象没有添加这 
                  个类型组件,
                //则GetComponent不会返回任何东西
                ReactiveTarget target = hitObject.GetComponent<ReactiveTarget>();//将碰撞 
                                                                            对象组件引用给
                                                                                 //攻击对 
                                                                    象:ReactiveTarget
                if(target == null)//击中对象是一个反应目标,则发射小球
                {
                    Debug.Log("啥也不是!!");
                }
                else
                {
                    //Debug.Log("Hit" + hit.point);
                    StartCoroutine(SphereIndicator(hit.point));//运行协程需要使用                                                            
                                                                                     
                                                               StartCoroutine()方法调用
                }
            }
        }
    }

 协程:当需要产生一些慢慢消失的物体时采用协程

private IEnumerator SphereIndicator(Vector3 pos)//球指示器,使用协程发射一个球到碰撞体上
    {   
        GameObject sphere = 
        GameObject.CreatePrimitive(PrimitiveType.Sphere);//CreatePrimitive:
                                                        //创建一个具有原始网格渲染器和相应碰撞体的游戏对象。
        sphere.transform.position = pos;
        yield return new WaitForSeconds(10);
        Destroy(sphere);
            
    }

(3) 敌人类:

单独写一个脚本:命名为ReactiveTarget(这里注意,如果这里命名更改或是未创建都会引起报错),将其附加到enemy上,这样就能达到只射击中方块而墙壁不会被影响的效果,当然这种效果也可以使用tag。

2.敌人受攻击倾斜效果

(1)重新创建一个脚本命名为ReactiveTarget,将其挂在enemy上

 

(2)打开脚本写一个公开可以被外部调用的ReactiveToHit方法,传入一个攻击值,调用RotateEnemy协程方法产生倾斜,并且减血量,当血量小于或等于0时,调用协程死亡方法。

ReactiveTarget类整体代码:

public class ReactiveTarget : MonoBehaviour
{
    private int Hp = 100;
    public void ReactiveToHit(int attract )
    {
        StartCoroutine(RotateEnemy());
        Hp -= attract;
        if (Hp <= 0)
        {
            StartCoroutine(Die());//协程的调用
        }
    }
   private IEnumerator Die()
    {
        yield return null;//new WaitForSeconds(1.5f);//等待1.5秒
        Destroy(this.gameObject);
    }
    private IEnumerator RotateEnemy()
    {
        this.transform.Rotate(-75, 0, 0);
        yield return new WaitForSeconds(0.5f);
        this.transform.Rotate(75, 0, 0);
    }
}

3.敌人AI漫游实现

(1)创造一个新脚本WangderingAI,也将其挂在enemy上

public class WangderingAI : MonoBehaviour
{
    public float speed = 3.0f;
    public float obstacleRange = 5.0f;

    private void Update()
    {
        divergentRay();
        move();
    }
    private void move()
    {
        transform.Translate(0, 0, speed * Time.deltaTime);
    }
    private void divergentRay()
    {
        Ray ray = new Ray(this.transform.position, this.transform.forward);//创建一个在这个物体位置和前方
                                                                           //为起点和方向的射线
        RaycastHit hitInfo;
        if(Physics.SphereCast(ray,0.75f,out hitInfo))
        {
            if(hitInfo.distance < obstacleRange)
            {
                float angle = Random.Range(-110, 110);
                transform.Rotate(0, angle, 0);
            }
        }
    }
}

持续更新!感兴趣记得关注哦

unity中设置子弹碰撞特效 unity中设置子弹碰撞特效,子弹碰撞特效第一想到的就是粒子系统........ 阅读详情

相关推荐

unity实现子弹散射效果和闪电链效果

实现爆炸散射效果可以按照以下步骤进行:1.准备子弹模型和爆炸特效模型,可以使用粒子特效或者模型。2.创建子弹和敌人模型,同时添加刚体组件。3.创建子弹的脚本,绑定到子弹上。4.在脚本中,对子弹的 OnTriggerEnter 或 OnCollisionEnter 函数做出响应,检测敌人碰撞事件发生。5.如果碰撞到了敌人,就创建一个爆炸粒子特效,并将子弹销毁。6.在爆炸粒子特效中,创建多个小子弹,随机攻击附近的敌人。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 3085

【unity demo】使用unity制作射击游戏demo (上)

使用unity制作射击游戏demo:搭建关卡场景,制作简单动画和粒子效果,基于unity物理系统实现玩家角色的基本移动,拾取,交互,射击等

又渲染又建模的一般通过工科绘画人的BLOG 7707

【unity实践demo】unity之子弹发射

unity子弹发射的基础原理

秩沅 5085

Unity——子弹跟踪

Unity——子弹跟踪 在射击类游戏中,会经常遇到需要子弹自动跟踪的功能需求,考虑用简单的方法,实现一个子弹自动跟踪的效果。 重点实现逻辑功能,对于子弹的发射器的prefabs的设计不重点考虑,只使用简单的cube等3D物体来模拟子弹、发射器、目标。 实现思路 自动跟踪,即子弹的朝向始终面对目标物。 子弹的位置和朝向都跟随时间进行变化,最终到达目标物处。 代码实现 创建发射器 创建一个cube作为发射器,添加一个shot脚本,每2秒发射一个子弹。 using System.Collections; usin

weixin_43165605的博客 7637

卡尔曼滤波原理详解及系统模型建立(simulink)

卡尔曼滤波原理详解及系统模型建立(simulink) 卡尔曼滤波器 卡尔曼滤波器是在上个世界五六十年代的时候提出的,到今天已经有六十年左右的时间,但卡尔曼滤波算法不管在控制、制导、导航或者通讯方面对数据的预测能力依然处在一个不可撼动的位置上,但是很多人对于其算法内部的工作原理究竟是怎么运作的依然不理解,所以在工程上很多人都只是把卡尔曼滤波当成是一种“黑箱”预测算法,并不清楚内部原理。但实际上没有任...

weixin_43942325的博客 7万+

当AI换脸遇上内容审核:Facefusion NSFW检测的技术伦理与用户自主权之争

本文探讨了Facefusion开源AI换脸工具中NSFW检测机制的技术伦理困境与用户自主权之争。分析了其多层次防御机制的技术实现与社区规避方法,揭示了开源软件在安全与自由之间的平衡难题,并提出了分层权限设计等社区实践方案。

weixin_29165725的博客 687

Unity3D粒子系统之子弹命中特效

本文将介绍如何使用Unity3D中的粒子效果,制作子弹命中物体后的火花特效。

weixin_50617270的博客 1808

Win11下USB-Blaster驱动安装全攻略:Quartus用户必看(附常见问题解决)

本文详细介绍了在Windows 11系统下为Intel FPGA开发工具Quartus安装USB-Blaster驱动的完整流程与常见问题解决方案。针对Win11更严格的驱动签名验证机制,提供了从标准安装步骤到高级故障排查(如禁用驱动强制签名、使用测试模式)的实用指南,帮助用户快速解决驱动安装失败问题,确保FPGA编程调试顺利进行。

weixin_29256771的博客 663

使用Unity3d的Physics.Raycast()的用法做子弹射击

  Class Functions 1)static function Raycast (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool 在origin坐标上建立一个方向为direction,距离为...

weixin_33966095的博客 546

PostgreSQL的学习心得和知识总结(八十二)|深入理解PostgreSQL数据库SQL语句的词法解析和语法解析流程

postgresql 词法解析语法解析流程

孤傲小二~阿沐的博客 5448

基于Python的Steam游戏评论与销量数据爬取及预测分析

随着数字游戏市场的蓬勃发展,Steam作为全球最大的数字游戏分发平台,积累了海量的游戏数据与玩家行为数据。本文旨在通过Python网络爬虫技术,采集Steam平台的游戏基本信息、玩家评论数据及销量相关信息,为后续的游戏评论情感分析与销量预测模型构建提供数据支持。本文将详细介绍使用requestsselenium等库实现Steam数据爬取的全过程,并提供完整的代码实现与数据处理方法。关键词:Steam;Python爬虫;数据采集;评论分析;销量预测。

2201_76125261的博客 855

Unity相机跟随以及子弹发射笔记

相机移动 现在还有一个问题是:主角SpaceMarine移动的时候,会走出玩家的视线,所以这里让相机跟随着SpaceMarine移动。 步骤1. 创建和设置CameraMount 在层级(Hierarchy)视图中,单击左上角的“Create”按钮,在打开的快捷菜单中选择“Create Empty”命令,将其重命名为“CameraMount”。 这里实现的基本想法是要让相机跟随CameraMount的位置,并且CameraMount的初始位置和SpaceMarine的位置是一样的。 从层级视图中选择Spac

weixin_53683742的博客 1101

SAP_MM/CO模块-超详细的CK11N/CK40N取值逻辑梳理(十几种业务场景,1.76W字)

本文主要讲述的是三个大的知识点,超详细,涉及到知识点比较多,并且串起来讲解,这也是我在网上搜不到相关资料才自己慢慢研究测试出来的,断断续续耗费了我一周多时间,相信只要你们认真看完,肯定会有所收获; 1、CK11N/CK40N成本发布功能中,系统前台的取数逻辑,涉及到多个采购信息记录、生产版本、货源清单、配额协议等对成本价发布的影响~~!! 2、CK11N与CK40N发布的成本价不一致的问题~~!! 3、如何处理外协加工物料的外协价与BOM组件成本取值不匹配的问题~~!!

风沙的博客 4085

Unity3d cs 移动、旋转、升降、开火发射子弹功能、using UnityEngine.UI、Instantiate实例化物体

using System.Collections; using System.Collections.Generic; using UnityEngine; public class sheji : MonoBehaviour{ // Start is called before the first frame update void Start() { } private int speed = 5; public Tra...

简公子的博客 1008

FANUC机器人通过ROBOGUIDE实现与实际的机器人进行程序导入导出的具体方法示例

FANUC机器人通过ROBOGUIDE实现与实际的机器人进行程序导入导出的具体方法示例

Robot_PLC_HMI_Automation 6536

vue3中使用antv-S2表格(基础功能版)

表格的数值默认会渲染排序 icon, 可以配置 showDefaultHeaderActionIcon关闭。当配置为对象时,always 控制是否在子维度不足 2 个时始终展示小计,默认不展示。首先创建一个vue3+vite+ts项目,可以查看下面相关文章,只看第一条即可。可以调整行宽、列宽、列排序、单个单元格详情展示、选中某列、某行等基本功能。可以通过上面设置的SUM函数自动计算出数值,也可以自定义累加函数。配置自定义方法优先级大于配置聚合方式,即配置。1、在项目中安装(npm/pnpm都可以)

蜗牛~~ 2210

【Unity2D】如何制作一个炮台追踪主角发射子弹

【Unity2D】如何制作一个炮台追踪主角发射子弹@[TOC](【Unity2D】如何制作一个炮台追踪主角发射子弹)一、前言(一)、制作想法来源(二)、效果预览二、制作流程(一)、准备(二)、炮台的旋转(三)、炮台的检测和发射子弹(三)、最后效果图三、结束语 一、前言 (一)、制作想法来源 前段时间为期末考试写了一篇博客,其中涉及到一个发射子弹击中主角的效果,由此想到了去制作一个发射子弹的炮台,其中考试的博客原文链接:点我跳转 (二)、效果预览 二、制作流程 (一)、准备 1.炮台素材,我为了简单,自己用

Z_hongli的博客 6490

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

射线发射子弹

using System.Collections; using System.Collections.Generic; using UnityEngine; /* 射线是虚拟的或者说场景中看不见的线,它从一些原点开始并指定方向延伸出去 使用命令ScreenPointToRay来发射 鼠标拾取是在3D场景中挑选出鼠标光标下对象的行为 */ public class RayShoot...

m0_37793426的博客 508

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Unity射线应用示例二:子弹射击

using System.Collections; using System.Collections.Generic; using UnityEngine; public class RayDemo_Shoot : MonoBehaviour { private Vector3 vecRayPoint; void Update () { if (Inp...

crazy_yun的博客 1380

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Unity给对象添加可见红外射线及射击功能

欢迎来到橘子广场。进入正题: 首先给枪添加LineRenderer组件,这里我选择的是局部坐标控制(世界坐标容易出问题),勾选1可以增加射线亮度,取消2勾选,3处调节射线范围大小 接下来就是代码部分: using UnityEngine; using System.Collections; using UnityEngine.UI; using UnityEngine.EventSystems; public class RayView : MonoBehaviour { public flo

nice_short的博客 1979

我的Unity(7)一点一滴 从相机向砖墙发射子弹

突发想写这个代码,练练手,基础知识需要扎实。public class Plane11 : MonoBehaviour { public GameObject m_cubeperfab; private GameObject m_cube; public GameObject m_spherePerfab; GameObject m_sphere; Rigi

m_cainiaokuaifei的博客 578

使用Unity粒子特效的基本步骤

一、Getting Started with Particle Systems 在Unity中打开已经建立好的Starter Project。 里面的资源分为几个文件夹: Materials:保存火材料。 Models:包含火炬和炸弹模型及其材料。 Prefabs:保存炸弹预制件。 Scenes:包含火炬和炸弹场景。 Scripts:保存初始脚本。 Textures:包含火材料的纹理。 现在您已经看到了所有内容的存储位置,您可以开始了解粒子系统在Unity中的工作原理。 二、Adding a

Peter的博客 1万+

[Unity学习笔记:FPS游戏制作(3)]子弹拖尾,碰撞与枪口火焰效果

1

qq_37704442的博客 6432

【Unity2D 2022:Particle System】添加命中粒子特效

1. 基础属性(1)修改发射粒子持续时间(Duration)为1s(2)取消勾选循环(Looping)(2)修改粒子存在时间(Start Lifetime)为0.1~0.2之间的随机值(3)修改粒子初始速度(Start Speed)为0(4)修改粒子初始尺寸(Start Size)为0.7~1之间的随机值(5)修改粒子初始旋转角度(Start Rotation)为0~360之间的随机值2. 发射器(Emission)(1)设置发射粒子速度(Rate over Time)为0(即不发射粒子)

qq_55048532的博客 986

unity 朝向目标物体发射子弹

朝着目标物体发射子弹,子弹在两点之间平均分布,可以控制平均角度,离点半径和数量。

sinat_38829681的博客 913
下一篇: Unity 项目错误汇总(更新ing)
uuunity鸭
博客等级 码龄6年 29粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uuunity鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值