unity实现射箭游戏

这篇具有很好参考价值的文章主要介绍了unity实现射箭游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目标

1.第一人称,玩家可以走动和转动视角

2.箭矢有抛物线轨迹,玩家可以通过不同的蓄力时长控制箭射出的速度

3.使用地形,绘制草和树,树具有碰撞体积

4.有静止靶和运动靶,运动靶使用unity的动画系统控制运动轨迹和速度

5.有射击区域,只有在射击区域内才能进行发射

6.在不同区域使用不同天空盒

7.记分,通过射中靶子得分

使用的资源:Standard Assets(使用其中的第一人称移动控制器),Fantasy Skybox FREE(天空盒、地形材质、草材质)、Free trees(树模型)、十字弩(弩和箭)
一、实现玩家走动和转动视角

按如下顺序组织资源,即可实现走动和视角控制,同时使得十字弩跟随镜头移动

u3d 虚拟vr射箭,unity,游戏,游戏引擎

二、实现弩蓄力

动画控制器转移顺序如下,其中hold和shoot都是混合树

u3d 虚拟vr射箭,unity,游戏,游戏引擎

u3d 虚拟vr射箭,unity,游戏,游戏引擎

u3d 虚拟vr射箭,unity,游戏,游戏引擎

zero是零蓄力状态的动作,资源中并没有提供。可以将Fill动画复制一份,然后打开编辑,将所有关键帧改为和初始帧相同,这样就是未蓄力的静止动画。在hold->shoot的转移过程添加bool条件“Fire”.

在shoot动画的最后一帧添加动画事件,触发脚本函数Shoot发射箭矢。在empty动画中添加动画事件,调用脚本函数EnterEmpty将Blend参数重置为0.将以下脚本挂载到十字弓上。这样按下右键就可以蓄力,蓄力后按下左键就可以发射。

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

public class FireControl : MonoBehaviour
{
    private Animator ani;
    public float fulltime;
    public float maxspeed;
    private float holdtime = 0;
    public GameObject prefab; // 预制对象的引用

    // Start is called before the first frame update
    void Start()
    {
        ani = GetComponent<Animator>();
    }

    private void FixedUpdate()
    {
        AnimatorStateInfo stateInfo = ani.GetCurrentAnimatorStateInfo(0);
        if (Input.GetButton("Fire1"))
        {
            ani.SetBool("Fire", true);
        }
        else
        {
            ani.SetBool("Fire", false);
        }
        if(Input.GetButton("Fire2"))
        {
            ani.SetBool("Holding",true);
            if(holdtime < fulltime && ani.GetCurrentAnimatorStateInfo(0).IsName("hold"))
                holdtime += Time.deltaTime;
            ani.SetFloat("Blend", holdtime / fulltime);
        }
        else
        {
            ani.SetBool("Holding", false);
        }
    }
    // Update is called once per frame
    void Update()
    {
    }
    public void EnterEmpty()
    {
        holdtime = 0;
        ani.SetFloat("Blend", 0);
    }
    public void Shoot(string name)
    {
        Debug.Log("Shoot");
        if (name == "shoot")
        {
            SSDirector.getInstance().currentSceneController.Shoot(ani.GetFloat("Blend") * maxspeed);//发射箭矢
        }
    }
}
三、绘制地形、草、树

其中树需要手动为预制件添加组件“Capsule Collider”,以增加碰撞体。

u3d 虚拟vr射箭,unity,游戏,游戏引擎

四、制作静止靶和运动靶

静止靶制作为蓝色,运动靶制作为红色

u3d 虚拟vr射箭,unity,游戏,游戏引擎u3d 虚拟vr射箭,unity,游戏,游戏引擎

为运动靶添加动画。通过窗口->动画->动画打开动画编辑器。选中运动靶游戏对象->选择添加动画->添加运动靶的位置属性->设置三个关键帧,初始帧坐标为(0,0,0),末尾帧的位置坐标和初始帧相同。然后创建动画控制器,设置如下动画转移:

u3d 虚拟vr射箭,unity,游戏,游戏引擎

可以选中targetMove1修改其播放速度。最后将动画控制器添加到靶子上,并勾选“应用根运动”,这样可以将预制件复制到不同位置进行往返运动。

五、设置射击区域

出于游戏性考虑,射击区域应该是玩家可见的,这里将射击区域设计为半透明的蓝色方块:

u3d 虚拟vr射箭,unity,游戏,游戏引擎

勾选Box Collider的“是触发器”选项,这样玩家就可以穿过该方块。在该方块上添加脚本,实现   OnTriggerEnter和OnTriggerExit,分别将玩家进入和退出射击区域的事件通知场记对象。场记在玩家进入射击区域时将布尔变量shootArea标记为true,在离开时标记为false。同时在十字弩的动画转移“hold”->shoot中添加额外条件“ShootArea”,将其与shootArea同步,这样就使得玩家不在射击区域时不能触发shoot动画,也就不会射出箭矢。

除了射击区域,我还设计了补给区域。为动画转移Empty->hold添加bool条件HasArrow。进入补给区域时将剩余箭的数量改为10,每次射箭减少1,减为0时将HasArrow改为false,进入补给区时改为true。这样在没有箭矢时也不会播放装填动画。

u3d 虚拟vr射箭,unity,游戏,游戏引擎

六、天空盒

使用Fantasy Sky FREE的天空素材。

用一个巨大的正方体触发器覆盖一半的游戏区域。当玩家进入或离开该碰撞体时触发天空切换。切换天空的脚本如下:

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

public class SkyControl : MonoBehaviour
{
    public Material[] mats;
    private static int index = 0;
    public int changeTime;//更换天空盒子的秒数

    public  void ChangeBox()
    {
        Debug.Log("change skybox"+index);
        RenderSettings.skybox = mats[index];
        index++;
        index %= mats.Length;
    }
    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
    }
}

在unity编辑器页面拖入天空盒素材到mats数组,这里只添加两个天空盒素材,使得两个区域和天空盒有固定映射关系。

七、记分

射箭时,将箭的游戏对象命名为“arrow”,在靶子发生碰撞时,检查collision.gameObject的名称是否为“arrow”,若是则通知场记,同时传递当前靶子的分值(脚本的public字段,可以在unity编辑器页面修改)。每个射击区域有各自的得分倍率,在进入区域时也将倍率传递给场记。场记在收到命中事件后,将靶子的分值乘上当前区域的得分倍率,作为此次命中的得分。

代码:3DgameDesign/lab11_Assets at main · xu-yongjia/3DgameDesign (github.com)

视频:unity作业-射箭游戏_哔哩哔哩_bilibili文章来源地址https://www.toymoban.com/news/detail-761252.html

到了这里,关于unity实现射箭游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • U3D游戏角色血条制作并显示血量变化

    关键:利用Slider来制作血条 大概效果: 数字会随着血量变化而变化。 步骤 1、在层级面板中右击,选择UI中的Slider. 2、创建好后,将Slider命名为HealthBar,可以看到层级面板中Slider的结构为,删掉其中的“Handle Slide Area”. 3、在层级面板选中HealthBar,在右侧的检查器窗口可以看到

    2024年02月09日
    浏览(31)
  • web3D三维引擎(Direct3D、OpenGL、UE、U3D、threejs)基础扫盲

    三维引擎是指用于创建和渲染三维图形的软件框架。它们通常提供了图形处理、物理模拟、光照、碰撞检测等功能,帮助开发者构建逼真的三维场景和交互体验。在这里,我将为您详细介绍一些常见的三维引擎,包括Direct3D、OpenGL、Unreal Engine、Unity3D和Three.js。 Direct3D是由微软

    2024年02月11日
    浏览(46)
  • U3D通过按钮点击实现场景切换

    1.新建UI,选择button选项,新建button;   3.新建一个空对象,挂载一个scenechange c#脚本; 4.编写脚本,1头文件using UnityEngine.SceneMangement                    2public void change() {                     scenemanager.loadscene (1)  }//括号中的数字为第2步中场景后面的数字          

    2024年02月07日
    浏览(36)
  • U3D客户端框架之 音效管理器 与 Fmod介绍安装导入Unity

    Unity内置的Audio底层使用的是FMOD,但是功能不够齐全,高级一点的功能如混合(Mix)等无法使用; 音效管理应该和Unity工程解耦合,这样子可以减轻音效设计师的负担; 使用FMOD后,游戏中我们只需要关心sound event名字就可以了,对具体音效资源不会产生依赖; 目前FMOD支持Windo

    2024年02月02日
    浏览(37)
  • Unity 3D射箭游戏

     地形:使用地形组件,上面有草、树;  天空盒:使用天空盒,天空可随时间变化  固定靶:有一个以上固定的靶标;  运动靶:有一个以上运动靶标,运动轨迹,速度使用动画控制;  射击位:地图上应标记若干射击位,仅在射击位附近可以拉弓射击;  驽弓动画:支持

    2024年02月05日
    浏览(32)
  • Unity骚操作:更改u3d导出apk时候所使用的 gradle、GradleTemplates、VisualStudioGradleTemplates、minifyEnabled是否开启混淆等

    测试unity版本:5.6.4 gradle文件夹:里面的是一些unity用自身打包apk时候用到的一些工具 GradleTemplates文件夹:    libTemplate.gradle  mainTemplate.gradle  settingsTemplate.gradle 附上让Unity自身打APK的时候 使用上镜像并且设置上 build:gradle通用工具让 需要生成AS工程的时候 可以让AS识别

    2024年02月14日
    浏览(44)
  • U3D客户端框架之支持断点续传的文件下载器实现方案

            文件下载器是应用程序的基础模块,为应用程序与外部网络交互提供了必要的桥梁。该模块设计初衷是为了热更新过程中,下载CDN站点上的文件资源,所以下载器会验证 要下载的文件是否存在于CDN中。如果存在允许下载器继续工作;如果不存在会跳过本地下载。

    2024年02月07日
    浏览(39)
  • U3D面试汇总!!!

    ① 微软开发的一种 OOP 编程语言。专门用于.NET应用而开发。 ② 面向对象的 三大特征 (封装,继承,多态)。除了三大特征以外,C#还添加了 事件和委托 ,增强了编程的灵活性。 ③ 简单,安全 。C#不再使用指针,而且不允许直接读取内存等不安全操作。提供了相比C/C++,

    2023年04月08日
    浏览(46)
  • U3D热更新技术

    @作者 : SYFStrive @博客首页 : HomePage 📌: 个人社区(欢迎大佬们加入) 👉: 社区链接🔗 🤷‍♀️: 创作不易转发需经作者同意😈 💃: 程序员每天坚持锻炼💪 👉 U3D热更新技术 (🔥) 🕐:开发者将测试好的代码,发布到应用商店的审核平台,平台方会进行稳定性及性

    2024年02月02日
    浏览(40)
  • AVProVideo☀️一、一款U3D视频播放插件介绍

    🎊 商务合作:https://skode.cn/file/businesscard/wechat.jpg 🎥 本文由 星河造梦坊公司官方 原创! 🏅 如果你有技术问题或项目开发,都可以加上方的联系方式,和我聊一聊你的故事🧡 前段时间看到有人问: 橙哥,AVProVideo支持8K全景视频嘛? 看来,好多人对这款插件的支持的功能

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包