【Unity2D:C#Script】实现角色射击功能

news2024/10/7 12:20:34

一、创建子弹预制体

1. 创建子弹预制体

fca4140e8f54467fbc7d96df2f65af29.png

2. 调整图片大小、层级

86e6bed9ea0e4607a2341ba6a98b8b28.png

二、为子弹添加碰撞体积

1. 添加Box Collider 2D、Rigidbody 2D组件

b6918a7283064b72a7059295439a0a31.png

2. 锁定z轴

15ebf757c5ff4f1a87252ac767d9c9ac.png

三、编辑敌人脚本

        注:在以下代码中,只显示本章节新增的代码,省略原有的代码

1.  为敌人添加生命等基础属性

public class Enemy : MonoBehaviour
{
    // 定义敌人的最大生命值和当前生命值
    private int maxHealthPoint = 100;
    public int healthPoint;
}

2. 初始化:给当前生命值赋值

public class Enemy : MonoBehaviour
{
    // 定义敌人的最大生命值和当前生命值
    private int maxHealthPoint = 100;
    public int healthPoint;

    void Start()
    {
        // 为当前生命值赋值
        healthPoint = maxHealthPoint;
    }

}

3. 为敌人添加改变生命值的方法

public class Enemy : MonoBehaviour
{
    // 定义敌人的最大生命值和当前生命值
    private int maxHealthPoint = 100;
    public int healthPoint;

    void Start()
    {
        // 为当前生命值赋值
        healthPoint = maxHealthPoint;
    }

    // 敌人改变生命值
    public void changeHealthPoint(int value)
    {
        healthPoint = Mathf.Clamp(value, 0, maxHealthPoint);
        if(healthPoint <= 0) {
            Destroy(gameObject);
        }
    }

}

四、编辑子弹脚本

1. 创建刚体对象、初始时获取刚体组件

        注意:此时使用Awake方法而不是Start方法,Awake方法会在物体实例化时立刻调用,而Start方法不会

public class Bullet : MonoBehaviour
{
    // 创建刚体对象
    private Rigidbody2D rigidbody2d;

    void Awake()
    {
        // 获取刚体组件
        rigidbody2d = GetComponent<Rigidbody2D>();
    }

}

2. 添加发射子弹方法,传递一个二维向量(力的方向)和浮点数(力的大小)做为参数

public class Bullet : MonoBehaviour
{
    // 创建刚体对象
    private Rigidbody2D rigidbody2d;

    void Awake()
    {
        // 获取刚体组件
        rigidbody2d = GetComponent<Rigidbody2D>();
    }

    // 发射子弹方法
    public void launch(Vector2 direction, float force)
    {
        rigidbody2d.AddForce(direction * force);
    }

}

3. 添加子弹击中敌人的方法

        此时Destroy(gameObject)语句没有放在if判断语句中,说明无论子弹与什么物体发生碰撞,都会销毁。(下文将设置碰撞层级,取消子弹和Ruby、河流之间的碰撞)

public class Bullet : MonoBehaviour
{
    // 创建刚体对象
    private Rigidbody2D rigidbody2d;

    void Awake()
    {
        // 获取刚体组件
        rigidbody2d = GetComponent<Rigidbody2D>();
    }

    // 发射子弹方法
    public void launch(Vector2 direction, float force)
    {
        rigidbody2d.AddForce(direction * force);
    }

    // 击中敌人方法
    private void OnCollisionEnter2D(Collision2D collision)
    {
        Enemy enemy = collision.gameObject.GetComponent<Enemy>();
        if (enemy != null) {
            enemy.changeHealthPoint(-25);
        }
        Destroy(gameObject);
    }

}

五、编辑角色脚本

 1. 创建子弹预制体对象

public class Ruby : MonoBehaviour {

    // 创建子弹对象
    public GameObject bulletPrefab;

}

2. 新建发射子弹的方法

        创建子弹游戏对象,将子弹预制体实例化,创建子弹对象,获取子弹游戏物体的C#脚本组件,调用子弹对象的launch方法,再触发Shoot参数(目前没有,文章后面会创建)

public class Ruby : MonoBehaviour {

    // 创建子弹对象
    public GameObject bulletPrefab;

    // Ruby发射子弹
    private void shoot()
    {
        GameObject bulletObject = Instantiate(bulletPrefab, rb2d.position, Quaternion.identity);
        Bullet bullet = bulletObject.GetComponent<Bullet>();
        bullet.launch(lookDirection, 300);
        animator.SetTrigger("Shoot");
    }

}

3. 当按下空格键时,Ruby调用射击函数,实现射击功能

public class Ruby : MonoBehaviour {

    // 创建子弹对象
    public GameObject bulletPrefab;

    void Update()
    {
        // Ruby射击
        if(Input.GetKeyDown(KeyCode.Space)) {
        shoot();
        }
    }

    // Ruby发射子弹
    private void shoot()
    {
        GameObject bulletObject = Instantiate(bulletPrefab, rb2d.position, Quaternion.identity);
        Bullet bullet = bulletObject.GetComponent<Bullet>();
        bullet.launch(lookDirection, 300);
        animator.SetTrigger("Shoot");
    }

}

六、创建Ruby射击的动画混合树

        动画混合树详细教程:【Unity】动画混合树

1. 打开Animator窗口,新建一个Shoot混合树(红色)

2. 新建一个Trigger类型的参数Shoot(蓝色)

3. 建立Move和Idle通向Shoot的连接,并添加条件为Shoot,建立Shoot通向Idle的连接,不添加任何条件(黄色)

4cfbd12cad6e40c8884b8527c10325e9.png

4. 新建四个Ruby射击的AnimationClip文件(上下左右),添加到Shoot混合树的四个Motion中(红色)

5. 将混合类型修改为2D简单方向,将两个参数修改为LookX和LookY(蓝色)

6. 修改四个Motion的两个参数(黄色)

c16d55d3a94942de88f6fd64fdbb7caf.png

7. 在Ruby的Animator窗口中,将指向Shoot的的箭头取消退出时间,将过渡时间缩短为0

75ed5111842a4b48aa2ae52e3c82479a.png

七、将bullet预制体挂载到Ruby创建的bulletPrefab对象

a79939e705764e179cbdd5efe6713286.png

八、通过层级控制碰撞检测

1. 点击Ruby游戏对象,进入层级控制设置,点击添加层

b0a2012ea3164fd9be70285861945759.png

2. 添加两个层级:player层、bullet层和background层

 5dc315ef31b74c13bf8364a407e6aa26.png

3. 将Ruby的层级设置为player

91f48d544edb438bb6ea3a2c9c7fbea7.png

4. 将bullet的层级设置为bullet

1bb8789e7eda4e86b2823529a491c5b6.png

5. 将TileMap的层级设置为background

e9e2afd34d8f41e2b0b85269b6abbabe.png

6. 点击Edit,进入Project Settings面板

8d8d174c71a24054b363cdb265536f8d.png

7. 点击Physics选项,Layer Collision Matrix,取消bullet层和bullet层、player层、background层的碰撞

65ef695d79204021aceb91f0f40c31f1.png

九、子弹的销毁

        注:在以下代码中,只显示本标题新增功能的代码,省略原有的代码

1. 添加Ruby游戏物体

public class Bullet : MonoBehaviour
{
    // 创建ruby游戏物体
    public GameObject ruby;
}

2. 获取Ruby游戏物体

public class Bullet : MonoBehaviour
{
    // 创建ruby游戏物体
    public GameObject ruby;

    void Awake()
    {
        // 获取Ruby游戏物体
        ruby = GameObject.Find("Ruby");
    }

}

3. 新增销毁子弹逻辑:若子弹离Ruby过远,则删除子弹;

        magnitude方法是获取二维向量的模长;此if判断的含义是:若子弹到坐标轴原点的距离(即模长)减去Ruby到坐标原点的距离大于12(此时可认为Ruby和子弹之间近似的距离大于12),则删除子弹

public class Bullet : MonoBehaviour
{
    // 创建ruby游戏物体
    public GameObject ruby;

    void Awake()
    {
        // 获取Ruby游戏物体
        ruby = GameObject.Find("Ruby");
    }

    void Update()
    {
        // 若子弹离Ruby过远时,销毁子弹
        if(rigidbody2d.transform.position.magnitude - ruby.transform.position.magnitude > 12) {
            Destroy(gameObject);
        }
    }

}

        本章完。感谢阅读! 

 

 

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

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

相关文章

安科瑞为河南省促进分布式光伏发电健康持续发展提供解决方案

1 光伏、储能运维市场分析 在光伏、储能行业飞速发展的同时&#xff0c;已建的光伏、风力发电站和储能系统的监控、运维管理项目的招标也非常多&#xff0c;2023年上半年&#xff0c;光伏电站开发企业运维招标规模28.6GW&#xff0c;同比增长204.3%&#xff0c;上述28.6GW招标…

抖店一件代发,从0到1操作全流程

我是王路飞。 先说明一点&#xff0c;新手不需要纠结抖店一件代发&#xff08;即无货源模式&#xff09;还能不能做的问题。 无货源只是前期帮助新手阶段的你进入到这个市场里来的一种方式&#xff0c;不是你长期做店的思路。 入门之后&#xff0c;基本就转型为有货源去玩了…

深度学习之基于暗通道算法+卷积神经网络图像去雾可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 在图像处理领域&#xff0c;图像去雾技术一直是一个重要的研究方向。由于雾霾等天气条件的影响…

vue项目中如何使用iconfont

导读&#xff1a;vue项目中引入iconfont的方式 iconfont 的三种使用方法 unicode 不常用Font class 像字体一样使用&#xff0c;默认黑色图标&#xff0c;无法修改颜色Symbol 支持多色图标&#xff0c;更灵活&#xff0c;推荐 一、unicode 略 二、Font class 方式一&#…

一般EI论文的格式是什么样的?

论文应该符合会议的提交要求和模板&#xff0c;包括页面格式、字体、字号、行距等。可以在特定会议的官方网站上找到详细的提交指南和模板。 EI会议论文的格式通常遵循以下基本结构&#xff1a; 标题和作者信息&#xff1a;论文标题应该简洁明了&#xff0c;能够准确概括您研究…

【金砖赛】基于docker搭链

一&#xff0e;基于docker搭建 启动并检查是否启动成功 #启动命令 sudo systemctl start docker#检查命令 sudo systemctl status docker修改权限 chomd 777 build_chain.sh 进行4节点联盟链搭建&#xff08;举例&#xff09; sudo ./build_chain.sh -d -l "127.0.0.1…

Java web应用性能分析之【高并发之缓存-多级缓存】

说到缓存&#xff0c;作为java开发第一时间想到的是不是上图所示的Redis&#xff0c;又或者是Guava Cache、Caffeine、EhCache这些&#xff1b;Redis作为分布式缓存、其他的可以作为本地缓存。但是作为一名资深开发人员&#xff0c;着眼的层面应该再提升一个级别&#xff0c;从…

云上聚智——移动云云服务器进行后端的搭建及部署

什么是移动云 移动云是指将移动设备和云计算技术相结合&#xff0c;为移动应用提供强大的计算和存储能力的服务模式。传统的移动应用通常在本地设备上进行计算和存储&#xff0c;而移动云将这些任务转移到云端进行处理。通过移动云&#xff0c;移动设备可以利用云端的高性能计算…

Linux程序开发(三):MakeFile编程及Githup项目编码

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

海外私人IP和原生IP有什么区别,谁更有优势?

一、什么是海外私人IP&#xff1f;什么是原生IP&#xff1f; 1、海外私人IP&#xff1a; 海外私人IP是由专门的服务提供商提供的IP地址&#xff0c;这些IP地址通常与特定地理位置或国家相关联。这些IP地址独享私人而不用与其他用户共享。海外私人IP访问特定国家或地区的网站&am…

新定义RD8T36P48使用USCI0的TWI功能点亮OLED

时间不多&#xff0c;因此先只给出工程&#xff0c;等有时间再添加详细说明 现象 这是从之前的一个51单片机的程序移植过来的&#xff0c;主要修改了IIC启动和停止&#xff0c;以及数据发送的代码&#xff0c;我现在还不是很满意的一点是发送过程中要等待上一个字节发送完才能…

如何通过OpenHarmony的音频模块实现录音变速功能?

简介 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;是由开放原子开源基金会孵化及运营的开源项目&#xff0c;是面向全场景、全连接、全智能时代的智能物联网操作系统。 多媒体子系统是OpenHarmony系统中的核心子系统&#xff0c;为系统提供了相机、…

hpc中查看显存占用,等效nvidia-smi

nvidia-smi在hpc中无法使用&#xff0c; 但是可以通过以下方法查看应用程序占用的显存 先执行程序&#xff0c;之后 bjobs输出 可以看到使用的是gpu01节点 之后 ssh gpu01

高刚性滚柱直线导轨有哪些优势?

滚柱导轨是机械传动系统中用于支持和引导滑块或导轨的装置&#xff0c;承载能力较高、刚性强及高精度等特点。特别适用于大负载和高刚性的工业设备&#xff0c;如机床、数控机床等设备&#xff0c;这些优势使其在工业生产和机械设备中得到了广泛的应用。 1、高精度&#xff1a;…

营收净利双降、股东减持,大降价也救不了良品铺子

号称“高端零食第一股”的良品铺子(603719.SH)&#xff0c;正遭遇部分股东的“用脚投票”。 5月17日晚间&#xff0c;良品铺子连发两份减持公告&#xff0c;其控股股东宁波汉意创业投资合伙企业、持股5%以上股东达永有限公司&#xff0c;两者均计划减持。 其中&#xff0c;宁…

切换python和python3的版本

参考&#xff1a;http://t.csdnimg.cn/iUtSR 进入root sudo su 使用 sudo 权限运行 update-alternatives 命令&#xff0c;为 python 和 python3 设置默认版本。 sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1 sudo update-alternatives…

【Oracle篇】rman工具实用指南:常用命令详解与实践(第二篇,总共八篇)

&#x1f4ab;《博主介绍》&#xff1a;✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ &#x1f4ab;《擅长领域》&#xff1a;✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌️…

day 38 435.无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 968.监控二叉树

435.无重叠区间 思路 为了使区间尽可能的重叠所以排序来使区间尽量的重叠&#xff0c;使用左边界排序来统计重叠区间的个数与452. 用最少数量的箭引爆气球恰好相反。 代码 class Solution {public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,…

Python-温故知新

1快速打开.ipynb文件 安装好anaconda后&#xff0c;在需要打开notebook的文件夹中&#xff0c; shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面&#xff1a; 2 快速查看函数用法 光标放在函数上——shift键tab 3...