Unity 简单跑酷游戏策划与实现

游戏介绍

游戏名称:无尽探险跑酷(Endless Adventure Runner)
游戏类型:无尽跑酷
游戏背景

在一个充满未知和奇迹的世界中,玩家将扮演一名勇敢的探险家,穿越各种神秘的地域,躲避重重障碍,收集宝藏,并挑战自己的极限。

核心玩法
  • 跑酷冒险:玩家控制角色在无尽的道路上不断前进,通过跳跃和滑动来躲避障碍物。
  • 障碍与金币:道路上布满了各种障碍物和金币,需要玩家灵活操作以避免撞击障碍物同时收集金币。
  • 加速带挑战:偶尔会出现加速带,一旦角色踏上,将暂时获得极速冲刺的能力,增加游戏的刺激性和挑战性。
目标受众

无尽探险跑酷适合所有年龄段的玩家,特别是喜欢动作和挑战性游戏的玩家。

技术细节
  • 开发平台:Unity
  • 主要技术点:玩家控制、障碍物和金币生成算法、碰撞检测、UI设计、音效和动画处理。

游戏的业务逻辑

我们将游戏简化了一下!保留了下面的主要功能去开发!这样更适合初学者!

1. 角色运动

角色在一条无尽的道路上自动向前跑动。玩家可以通过输入控制角色跳跃或滑动来躲避障碍。

2. 障碍物和金币生成

在道路上随机生成障碍物和金币。障碍物的种类和生成频率随游戏进程逐渐增加。

3. 碰撞检测

检测角色是否与障碍物碰撞或收集到金币。碰撞障碍物会导致游戏结束,收集金币会增加得分。

4. 加速带

在道路上随机放置加速带,玩家角色接触后会获得短暂的速度提升。

5. 计分机制

玩家的得分基于行进的距离和收集的金币数量。游戏结束后显示总得分。

具体实现需要多个脚本,根据面向对象的思想,基本每一个功能都最好是单独的一个脚本!

场景搭建:

第一个脚本:玩家移动控制脚本 A\D控制左右移动

这段代码实现了对游戏中玩家的基本移动控制功能,包括左右移动、跳跃

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

public class PlayerCont : MonoBehaviour
{
    //Horizontal
    //1.控制玩家移动,input.getaix
    //2.A、D控制向左、右移动
    //3.W控制跳跃
   public GameObject Player;
    public float lrSPEED = 10F;
    public float JUMPSPEED = 5;
    public float RunSpeed = 10f;

    private void Start()
    {
        //Player = GameObject.Find("HPCharacter");
    }
    private void Update()
    {
        UserInput();
        AwalysRun();
    }
    //*=========================
    void UserInput()
    {
        //Debug.Log("检测用户按下的键盘A D W");
        float MoveZuoY = Input.GetAxis("Horizontal");
        ControlMove(MoveZuoY);
        
        if (Input.GetKey(KeyCode.W))
        {
            Jump();
        }
    }
    void ControlMove(float ZuoyouMove)
    {
        Player.transform.Translate(new Vector3(ZuoyouMove * lrSPEED * Time.deltaTime, 0, 0));

    }
   
    void Jump()
    {
        Player.transform.Translate(new Vector3(0, JUMPSPEED * Time.deltaTime, 0));
        //Debug.Log("角色开始移动了");
    }
    void AwalysRun()
    {
        Player.transform.Translate(new Vector3(0, 0, 1 * RunSpeed * Time.deltaTime));

    }
}

这是一个C#脚本,它被附加到名为PlayerCont的游戏对象上,用于控制游戏中的玩家运动。
以下是代码的部分功能的简单解释:

  1. 在代码的顶部,使用using语句来导入需要的命名空间。其中包含了System.Collections和System.Collections.Generic以及UnityEngine这三个常用的命名空间。
  2. 声明了一个名为Player的公共GameObject变量,用于存储玩家对象。同时声明了三个公有浮点型变量:lrSPEED、JUMPSPEED和RunSpeed,分别用来设置玩家左右移动的速度、跳跃的速度和恒定的前进速度。
  3. 在Start()函数中查找并赋值给Player变量。这个函数会在游戏启动时自动调用。
  4. Update()函数是Unity引擎每帧都会调用的一个方法,可以在这里进行每一帧的游戏逻辑更新。在Update()中调用了UserInput()和AwalysRun()两个函数。
  5. UserInput()函数主要用于获取用户的输入,并根据用户的操作来控制玩家的移动。通过检查用户按下的是哪个键(例如"A"或"D")来决定玩家应该向哪个方向移动,并通过ControlMove()函数实现这一操作。如果用户按下"W"键,则调用Jump()函数使玩家跳跃。
  6. ControlMove()函数将接收一个表示左右方向移动的参数,并将其乘以lrSPEED,然后利用Time.deltaTime来得到一帧内的时间差,计算出这一帧玩家应移动的距离。最后使用Transform.Translate()函数将玩家沿水平轴的方向平移指定距离。
  7. Jump()函数与ControlMove()类似,只不过这次是向上跳跃,会将玩家沿垂直轴的方向平移指定距离。
  8. AwalysRun()函数则始终让玩家保持向前移动。它同样使用Transform.Translate()函数,不过这次是沿z轴的方向移动。

脚本二 触发检测并克隆金币和障碍物

这个脚本用于在主角碰到不同触发器时克隆出不同的物体,并执行相应的操作,比如添加分数或者销毁物体等。

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

public class CollisionManager : MonoBehaviour
{
    //触发检测  1.克隆金币 2.恐克隆怪物  3.碰撞金币 吃掉它 加分 4.碰到怪物,掉血 5碰到加速带加速、减速
    //该触发检测脚本挂到 主角身上

    GameObject BeiTriggOBJ;
    public GameObject CoinMuban;
    public GameObject CloneCoinFather;

    public GameObject ObstuctionMuban;
    public GameObject CloneStruFather;

    //PlayerCont onPlayshizhe=new PlayerCont();//实例化对象


    private void OnTriggerEnter(Collider other)
    {

        BeiTriggOBJ = other.transform.gameObject;
        if (BeiTriggOBJ.tag == "rCoinTrigger")
        {
            //克隆金币
            ClonCoin();
        }
        if (BeiTriggOBJ.tag == "MonsterTrigger")
        {
            //克隆怪物
        }
        if (BeiTriggOBJ.tag == "TriggerSpeedUp")
        {
            //开始加速
            SpeedUp(10f);
        }

        //===================================
        if (BeiTriggOBJ.tag == "Coin")
        {
            //吃掉 加分
            Destroy(BeiTriggOBJ);
        }
        if (BeiTriggOBJ.tag == "Monster")
        {
            //掉血 停下来
            //PlayerCont.RunSpeed = 0;
        }
    }

    private void OnTriggerExit(Collider other)
    {
        if (other.transform.gameObject.tag == "TriggerSpeedUp")
        {
            SpeedUp(-10f);
        }
    }

    void ClonCoin()
    {
        Debug.Log("克隆金币");

        for (int i = 0; i < 10; i++)
        {
            Vector3 OnClonPos = new Vector3(153 + Random.Range(0, 6), 0, BeiTriggOBJ.transform.position.z + 50f + i * 3);
            GameObject.Instantiate(CoinMuban, OnClonPos, Quaternion.identity, CloneCoinFather.transform);
        }
    }
    void ClonMonster()
    {
        Debug.Log("克隆怪物");

        Vector3 OnClonPos = new Vector3(153 + Random.Range(0, 6), 0, BeiTriggOBJ.transform.position.z + 50f);
        GameObject.Instantiate(ObstuctionMuban, OnClonPos, Quaternion.identity, CloneStruFather.transform);
    }
    void SpeedUp(float Speed)//函数形参用法
    {
        Debug.Log("加速");
        PlayerCont.RunSpeed += Speed;
    }


}//end class
  1. 当主角碰到带有“TriggerCoin01”标签的触发器时,会触发脚本中的OnTriggerEnter()函数,开始克隆金币。在这个过程中,首先定义了一个新位置clonePos,然后使用GameObject.Instantiate()函数在clonePos位置上克隆出多个金币对象,并将它们设为CoinMuban模板对象的子级节点。
  2. 当主角碰到带有“TriggerStru”标签的触发器时,会触发脚本中的OnTriggerEnter()函数,开始克隆障碍物。在这个过程中,只是输出了一条消息,表示开始克隆障碍物,但实际上并没有做任何实际的操作。
  3. 当主角碰到带有“Coin”标签的物体时,会触发脚本中的OnTriggerEnter()函数,开始加分。在这个过程中,只会输出一条消息,表示开始加分,然后销毁触发碰撞的对象。
  4. 当主角碰到带有“Monster”标签的物体时,会触发脚本中的OnTriggerEnter()函数,开始扣分。在这个过程中,也只会输出一条消息,表示开始扣分。

【下周补充剩余部分】

脚本三 计分和掉血系统

改脚本也需要挂在到一个游戏物体,逻辑是:当主角的触发检测,检测到金币时,就跨类调用下面分数管理脚本的加分方法!同样掉血也一样!

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

public class ScoreManager : MonoBehaviour
{
    //分数管理 血量管理
    // 如果撞击到金币就加分,如果撞击到障碍物就掉血

    public int CurrentScore=0;
    public  int CurrentBlood = 10000;


    public void ScoreAdd()//构造函数
    {
        Debug.Log("加分函数开始执行");
        CurrentScore += 10;
        Debug.Log("分:"+CurrentScore);
    }


    public void SubBlood()//构造函数
    {
        Debug.Log("掉血函数开始执行");
        CurrentBlood -= 100;
        Debug.Log("血:" + CurrentBlood);
    }
    private void OnGUI()
    {     
        GUI.Label(new Rect(new Vector2(200, 200), new Vector2(500, 500)), CurrentBlood.ToString());
        GUI.Label(new Rect(new Vector2(20, 20), new Vector2(500, 500)), CurrentScore.ToString());

    }

}

猜你喜欢

转载自blog.csdn.net/leoysq/article/details/134111311