Unity-第一人称射箭游戏

1. 游戏概述

欢迎来到我们开发的第一人称射箭游戏!本游戏的设计目标是提供一种真实而又有趣的射箭体验。玩家可以在美丽的自然场景中自由移动,尝试不同的射箭技巧,挑战静态和动态的靶标,以获取高分。我们灵感来源于对射箭运动的热爱,希望通过这个游戏,让玩家感受到驽弓的魅力。
在这里插入图片描述

在接下来的博客中,我们将逐步介绍游戏的各个方面,包括地形与天空、靶标设计、射箭机制、玩家移动与动画、碰撞与计分等。让我们一起踏上这场射箭之旅!

2.总体设计

在这里插入图片描述

3. 游戏功能

3.1 3分钟游戏过程展示视频

为了更直观地展示游戏的核心玩法,我们提供了一段3分钟的游戏过程展示视频。

Unity-第一人称射箭游戏

3.2 地形和天空盒

3.2.1 地形生成和天空盒切换

  • SkyBoxController.cs: 天空盒管理脚本

    // 天空盒切换逻辑
    // 在按下特定按键时切换到下一个天空盒
    void Update()
    {
          
          
        // 通过按键触发天空盒切换
        if (Input.GetKeyDown(KeyCode.LeftShift))
        {
          
          
            ChangeSkybox();
        }
    }
    

    分析: 天空盒管理脚本通过在Update方法中检测按键触发,实现了切换天空盒的功能。这样的设计使得地形和天空盒的生成和切换与游戏管理逻辑分离,增强了代码的可维护性。

3.2.2 地形生成

在这里插入图片描述

3.3 靶标

3.3.1 靶标碰撞逻辑

  • TargetController.cs: 靶标控制脚本

    // TargetController.cs
    
    // 靶标的碰撞逻辑
    // 判断箭是否射中靶标,计算分数,并触发其他相关事件
    private void OnTriggerEnter(Collider other)
    {
          
          
        // 判断是否射中
        if (other.CompareTag("Arrow"))
        {
          
          
            int targetscore = Random.Range(targetConfig.MinScore, targetConfig.MaxScore);
            ScoreManager.Instance.IncreaseScore(targetscore);
    
            GameManager.Instance.setShootText();
    
            // 箭的处理逻辑
            // ...(省略箭的处理代码)
    
            // 返回靶标到池中,具体逻辑需要结合项目需求和TargetPool脚本
            // TargetPool.Instance.ReturnTargetToPool(gameObject);
        }
    }
    

    分析: 靶标控制脚本通过在OnTriggerEnter方法中判断是否射中箭,根据射中位置计算分数,并调用分数管理脚本的IncreaseScore方法。这种设计将靶标的碰撞逻辑与分数计算逻辑分开,提高了代码的模块化程度。

3.4 射击位和驽弓动画

3.4.1 射击位判定和驽弓动画逻辑

  • BowController.cs: 弓的控制脚本

    // BowController.cs
    
    // 射击位判定和驽弓动画逻辑
    void Update()
    {
          
          
        if (GameManager.Instance.gameStarted == true)
        {
          
          
            // ...(省略其他代码)
    
            // 在射击时触发Shoot状态
            if (Input.GetMouseButtonDown(0))
            {
          
          
                if (animator.GetBool("Hold") == true && GameManager.Instance.CheckIfShoot(transform.position))
                {
          
          
                    animator.SetTrigger("Shoot");
                    animator.SetBool("Hold", false);
                    animator.SetFloat("Charge", 0);
                    sliderValue = 0;
                    ShootArrow(normalizedCharge);
                }
            }
        }
    }
    

    分析: 弓的控制

脚本在Update方法中判定游戏是否开始,以及在合适的条件下触发射击动作。通过调用GameManagerCheckIfShoot方法,实现了在射击位附近才能拉弓射击的逻辑。

3.5 游走和碰撞计分

3.5.1 玩家移动和碰撞检测

  • GameManager.cs: 游戏管理脚本

    // GameManager.cs
    
    // 添加Transform元素的方法
    void AddGamePoint(Vector3 position)
    {
          
          
        GameObject newPoint = new GameObject("GamePoint");
        newPoint.transform.position = position;
        gamePoint.Add(newPoint.transform);
    }
    

    分析: AddGamePoint方法用于手动添加目标点,这些点作为玩家移动的参考,

  • PlayerMoving.cs: 玩家移动脚本

    // PlayerMoving.cs
    
    // 玩家移动
    public void movingPlayer(Vector3 targetPosition)
    {
          
          
        // 克隆对象
        GameObject new_player = Instantiate(gameObject, targetPosition, transform.rotation);
        new_player.GetComponent<PlayerMoving>().Initialize();
    
        Destroy(gameObject);
    }
    

    分析: 玩家移动脚本通过在movingPlayer方法中克隆新的玩家对象,实现了在地图上游走的效果。碰撞检测逻辑与具体的游戏逻辑结合,确保了玩家在游走过程中的合理性。

3.6 分数管理

3.6.1 分数增加和UI更新

  • ScoreManager.cs: 分数管理脚本

    // ScoreManager.cs
    
    // 分数增加和UI更新
    public void IncreaseScore(int targetscore)
    {
          
          
        score += targetscore;
        UpdateScoreText();
    
        // 达到一定分数时,触发胜利条件
        if (score >= 100)
        {
          
          
            score = 0;
            UpdateScoreText();
            //GameManager.Instance.EndGame("You Win!");
        }
    }
    

    分析: 分数管理脚本在IncreaseScore方法中处理了分数的增加和UI的更新逻辑。通过调用UpdateScoreText方法,实现了分数变化时UI的同步更新。此外,当分数达到一定条件时,可触发胜利逻辑。

3.7 游戏逻辑管理

在游戏中,我们通过GameManager脚本来管理游戏逻辑,包括按钮、下拉框的交互以及游戏的开始和结束等。

3.7.1 按钮和下拉框交互

  • 按钮和下拉框对象: 游戏中有“开始”按钮(startButton)和“重新开始”按钮(restartButton)。此外,还有一个下拉框(dropDown)用于选择不同的射击位。

  • 按钮监听和触发: 通过Button组件和DropDown组件的事件监听,实现了按钮点击和下拉框选择的相应功能。通过StartGameRestartGame方法来开始和重新开始游戏。

3.7.2 游戏状态控制

  • 游戏状态变量: 使用gameStarted变量来表示游戏是否已经开始。

  • 游戏开始逻辑: 游戏开始后,隐藏“开始”按钮,显示“重新开始”按钮,并初始化游戏相关设置,包括选择射击位和初始化靶子。

  • 游戏结束逻辑: 游戏结束时,显示结束文本,并在一段时间后重新加载当前场景。

3.7.3 射击位选择和判定

  • 射击位选择: 通过下拉框选择不同的射击位,玩家可以在地图上选择合适的位置开始游戏。

  • 射击判定: 使用CheckIfShoot方法判断玩家是否在射击位附近,确保只有在指定位置才能拉弓射击。

3.7.4 文本提示

  • 射击提示文本: 在射中靶标后,通过setShootText方法显示射击成功的提示文本,并在一段时间后隐藏。

以上逻辑由GameManager脚本中的方法和变量来控制,通过按钮和下拉框的交互,实现了游戏的开始、重新开始和射击等功能。

4. 游戏总结

通过以上的代码和功能介绍,我们完成了一个基于Unity引擎的第一人称射箭游戏。在这个游戏中,我们实现了多个核心功能,让玩家可以在虚拟的游戏世界中体验射箭的乐趣。

4.1 游戏亮点

4.1.1 自然场景

游戏中采用了Unity的地形组件,通过添加草地和树木等元素,打造了一个丰富多彩的自然场景。这不仅丰富了游戏的视觉效果,也增加了玩家的沉浸感。

4.1.2 动态天气和时间

通过天空盒的应用,游戏中实现了动态的天气和时间变化。玩家可以通过按键切换不同的天空盒,感受到游戏世界在不同时间段的变化。

4.1.3 靶标设计

游戏中设计了固定靶和运动靶,分别提供了稳定的射击目标和具有挑战性的移动目标。这丰富了游戏的射击体验,使玩家需要在不同情况下运用射箭技巧。

4.1.4 弓箭射击

通过驽弓动画的设计,玩家可以体验到蓄力半拉弓、hold住并在合适的时机射箭的操作。这增加了射击的技巧性,使游戏更具深度。

4.1.5 界面交互

游戏中使用了按钮和下拉框进行界面交互。玩家可以通过按钮开始游戏,通过下拉框选择射击位置。这增加了游戏的可操作性和用户体验。

4.2 游戏体验

整体来说,这个第一人称射箭游戏具有一定的可玩性和趣味性。玩家可以在虚拟的游戏环境中体验射箭的乐趣,感受到射击的技巧性和挑战性。游戏的自然场景、动态天气和时间变化为玩家营造了一个真实而又充满冒险感的游戏世界。

然而,也需要注意一些可能的改进空间,比如进一步优化射击位的设计、增加更多的游戏关卡和目标等,以提升游戏的可玩性和丰富度。

通过这个项目的开发,我们学习到了在Unity中处理场景、物体交互、动画和UI等方面的技能,为今后的游戏开发积累了经验。希望这个小游戏的实现能够对大家学习和理解Unity游戏开发提供一些帮助。

猜你喜欢

转载自blog.csdn.net/helianthus_254/article/details/134680086