【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

这篇具有很好参考价值的文章主要介绍了【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

需要源码和资源文件请点赞关注收藏后评论区留言私信~~~

下面我们将实现一个3D游戏 跑酷小子 类似于之前大火的神庙逃亡 效果展示和代码在文章末尾 下面为实现步骤

一、前期准备

在项目开始前 需要新建项目 将模型资源导入 模型资源存放在资源文件夹中

新建项目 注意选择3D模板 导入后如下图

【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

ParkourDemoModel.unitypackage是主角模型资源 RoadModel.unitypackage是路段及障碍物模型资源 将这两个资源包依次导入 全部导入后目录结构如下

 【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

二、路段设置

 在Project视图中的Models->SimpleRoadwoek->Prefabs文件夹中 可以找到需要的各类模型,包括路面 路标 障碍物等等 接下来我们进行路段摆放

将路段拖入Scenes视图后 进行复制摆放到镜像位置,然后复制十次依次摆放形成路面 效果如下

【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

接下来在路面上摆放装饰物,读者可以按照自己的想法摆放 接着做一面特殊的墙,用来检测玩家是否到达路段的中端,如果玩家到达路段中端,就切换路段,切换的逻辑会在后面实现

然后把上述资源全部放在一个对象下然后复制两次,并且设置另外两个对象的开始值,分别是50,0,0和100,0,0 这样总共有三条路段拼接在一起 

三、障碍物设置

只有路段 我们还需要在上面摆放障碍物来增加难度

读者可以自行根据喜好摆放 效果如下图

【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

接着我们将障碍物拖入一个物体下面进行复制 跟上面路段的操作类似 复制到后面的路段上

 【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

四、主角设置

接下来就是最重要的主角设置,包括对模型的设置 动画切换 主角的移动和摄像机的跟随等等

 将主角模型直接拖入Scenes视图中即可,接着设置主角动画,在Project视图中右击 选择Create-

> Animator Control命令  新建一个动画控制器 把主角的动画控制逻辑弄好 如下图所示

【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

接下来还要设置主角移动 主角死亡判定以及摄像机跟随等等业务逻辑 由于用代码控制 此处不再赘述

五、效果展示

 运行程序 3D游戏效果如下

可以看到场景十分逼真 读者可以根据自己喜好进行修改

【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

 【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)

 六、代码

部分代码如下

1

using System.Collections.Generic;
using UnityEngine;

public class Control_Scenes : MonoBehaviour
{
    //是否到达第一段路
    bool m_ISFirst;
    //所有的路段对象
    public GameObject[] m_RoadArray;
    //障碍物数组对象
    public GameObject[] m_ObstacleArray;
    //障碍物的位置
    public List<Transform> m_ObstaclePosArray = new List<Transform>();

    void Start()
    {
        //游戏开始自动生成3组障碍物
        for (int i = 0; i < 3; i++)
        {
            Spawn_Obstacle(i);
        }
    }

    //根据传递的参数来决定切换那条路段
    public void Change_Road(int index)
    {
        //到达第一条路段不切换
        if (m_ISFirst && index == 0)
        {
            m_ISFirst = false;
            return;
        }
        else
        {
            int lastIndex = index - 1;
            if (lastIndex < 0)
                lastIndex = 2;
            //当前到达的路段的上一条路段进行切换,也就是说达到第二条路段,将第一条路段进行切换
            m_RoadArray[lastIndex].transform.position = m_RoadArray[lastIndex].transform.position + new Vector3(150, 0, 0);
        }
    }

    public void Spawn_Obstacle(int index)
    {
        //销毁原来的对象
        GameObject[] obsPast = GameObject.FindGameObjectsWithTag("Obstacle" + index);
        for (int i = 0; i < obsPast.Length; i++)
        {
            Destroy(obsPast[i]);
        }
        //生成障碍物 每个m_ObstaclePosArray对象中都存有三个坐标
        foreach (Transform item in m_ObstaclePosArray[index])
        {
            GameObject prefab = m_ObstacleArray[Random.Range(0, m_ObstacleArray.Length)];
            Vector3 eulerAngle = new Vector3(0, Random.Range(0, 360), 0);
            GameObject obj = Instantiate(prefab, item.position, Quaternion.Euler(eulerAngle));
            obj.tag = "Obstacle" + index;
        }
    }
}

2

using UnityEngine;
public class Control_Player : MonoBehaviour
{
    //前进速度
    public float m_ForwardSpeeed = 7.0f;
    //动画组件
    private Animator m_Anim;
    //动画现在状态
    private AnimatorStateInfo m_CurrentBaseState;

    //动画状态参照
    static int m_jumpState = Animator.StringToHash("Base Layer.jump");
    static int m_slideState = Animator.StringToHash("Base Layer.slide");

    void Start()
    {
        //获得主角身上的Animator组件
        m_Anim = GetComponent<Animator>();
    }

    void Update()
    {
        //主角向前跑
        transform.position += Vector3.right * m_ForwardSpeeed * Time.deltaTime;
        //获得现在播放的动画状态
        m_CurrentBaseState = m_Anim.GetCurrentAnimatorStateInfo(0);
        if (Input.GetKeyDown(KeyCode.W))
        {
            m_Anim.SetBool("jump", true);//切换跳状态
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            m_Anim.SetBool("slide", true);//切换下滑状态
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            Change_PlayerZ(true);//移动主角向左移动
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            Change_PlayerZ(false);//移动主角向右移动
        }
        if (m_CurrentBaseState.fullPathHash == m_jumpState)
        {
            m_Anim.SetBool("jump", false);//改变动画状态
        }
        else if (m_CurrentBaseState.fullPathHash == m_slideState)
        {
            m_Anim.SetBool("slide", false);//改变动画状态
        }
    }

    public void Change_PlayerZ(bool IsAD)
    {
        if (IsAD)//当按下键盘的A 也就是向左移动
        {
            //主角在最左边
            if (transform.position.z == -5f)
                return;
            //主角在中间
            else if (transform.position.z == -10f)
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -5f);
            }
            //主角在最右边
            else
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -10f);
            }
        }
        else//当按下键盘的D 也就是向右移动
        {
            //主角在最右边
            if (transform.position.z == -15f)
                return;
            //主角在中间
            else if (transform.position.z == -10f)
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -15f);
            }
            //主角在最左边
            else
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -10f);
            }
        }
    }
}

3

using UnityEngine;
using UnityEngine.SceneManagement;

public class Control_Player : MonoBehaviour
{
    //前进速度
    public float m_ForwardSpeeed = 7.0f;
    //动画组件
    private Animator m_Anim;
    //动画现在状态
    private AnimatorStateInfo m_CurrentBaseState;

    //动画状态参照
    static int m_jumpState = Animator.StringToHash("Base Layer.jump");
    static int m_slideState = Animator.StringToHash("Base Layer.slide");

    void Start()
    {
        //获得主角身上的Animator组件
        m_Anim = GetComponent<Animator>();
    }

    void Update()
    {
        //主角向前跑
        transform.position += Vector3.right * m_ForwardSpeeed * Time.deltaTime;
        //获得现在播放的动画状态
        m_CurrentBaseState = m_Anim.GetCurrentAnimatorStateInfo(0);
        if (Input.GetKeyDown(KeyCode.W))
        {
            m_Anim.SetBool("jump", true);//切换跳状态
        }
        else if (Input.GetKeyDown(KeyCode.S))
        {
            m_Anim.SetBool("slide", true);//切换下滑状态
        }
        else if (Input.GetKeyDown(KeyCode.A))
        {
            Change_PlayerZ(true);//移动主角向左移动
        }
        else if (Input.GetKeyDown(KeyCode.D))
        {
            Change_PlayerZ(false);//移动主角向右移动
        }
        if (m_CurrentBaseState.fullPathHash == m_jumpState)
        {
            m_Anim.SetBool("jump", false);//改变动画状态
        }
        else if (m_CurrentBaseState.fullPathHash == m_slideState)
        {
            m_Anim.SetBool("slide", false);//改变动画状态
        }
        if (m_IsEnd && Input.GetKeyDown(KeyCode.F1))
        {
            //重新开始游戏
            SceneManager.LoadScene(0);
        }
    }

    public void Change_PlayerZ(bool IsAD)
    {
        if (IsAD)//当按下键盘的A 也就是向左移动
        {
            //主角在最左边
            if (transform.position.z == -5f)
                return;
            //主角在中间
            else if (transform.position.z == -10f)
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -5f);
            }
            //主角在最右边
            else
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -10f);
            }
        }
        else//当按下键盘的D 也就是向右移动
        {
            //主角在最右边
            if (transform.position.z == -15f)
                return;
            //主角在中间
            else if (transform.position.z == -10f)
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -15f);
            }
            //主角在最左边
            else
            {
                transform.position = new Vector3(transform.position.x, transform.position.y, -10f);
            }
        }
    }

    //游戏结束
    bool m_IsEnd = false;
    void OnGUI()
    {
        if (m_IsEnd)
        {
            GUIStyle style = new GUIStyle();
            style.alignment = TextAnchor.MiddleCenter;
            style.fontSize = 40;
            style.normal.textColor = Color.red;
            GUI.Label(new Rect(Screen.width / 2 - 100, Screen.height / 2 - 50, 200, 100), "你输了~点击F1重新开始游戏", style);
        }
    }
    void OnTriggerEnter(Collider other)
    {
        //主角如果碰撞到障碍物
        if (other.gameObject.name == "Vehicle_DumpTruck" || other.gameObject.name == "Vehicle_MixerTruck")
        {
            m_IsEnd = true;
            m_ForwardSpeeed = 0;
            m_Anim.SetBool("idle", true);
        }
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~文章来源地址https://www.toymoban.com/news/detail-412921.html

到了这里,关于【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Unity 跑酷游戏全部脚本(完结)

    这个脚本是主角身上的脚本,用于检测是否碰到其他触发器,并做出对应的行为    using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliidisonTrigger : MonoBehaviour {     //触发检测  1.碰到金币克隆区,克隆金币 2.恐克隆怪物  3.碰撞金币 吃掉它 加分 4.碰到

    2024年02月04日
    浏览(39)
  • Unity 简单跑酷游戏策划与实现

    游戏名称:无尽探险跑酷(Endless Adventure Runner) 游戏类型:无尽跑酷 游戏背景 在一个充满未知和奇迹的世界中,玩家将扮演一名勇敢的探险家,穿越各种神秘的地域,躲避重重障碍,收集宝藏,并挑战自己的极限。 核心玩法 跑酷冒险 :玩家控制角色在无尽的道路上不断前

    2024年02月03日
    浏览(48)
  • 【Unity】教你如何使用Unity制作一个简单的跑酷游戏

    其实用Unity制作游戏并不难,如果你想学习,那我就建议你想从制作一个简单的跑酷游戏来找到兴趣,因为如果你一开始就一直学习一些没什么必要的语法,这样就会让你一开始就失去了信心,失去了学习Unity的动力,所以如果你先学习如何制作一个简单的跑酷地图,然后你就

    2024年02月21日
    浏览(57)
  • 教你如何使用Unity制作一个简单的跑酷游戏

    其实用Unity制作游戏并不难,如果你想学习,那我就建议你想从制作一个简单的跑酷游戏来找到兴趣,因为如果你一开始就一直学习一些没什么必要的语法,这样就会让你一开始就失去了信心,失去了学习Unity的动力,所以如果你先学习如何制作一个简单的跑酷地图,然后你就

    2024年02月04日
    浏览(68)
  • Unity游戏项目_3D迷宫(游戏源码免费)

    目录 一、效果图 二、讲解 三、资源分享 总结 游戏开始界面: 游戏画面: 游戏结束界面: 主要代码如下: 1.链接代码 2.小球移动代码 3、结束与打包代码   Unity游戏项目_3D迷宫(游戏源码免费)。包括游戏项目和打包后PC端游戏, 下载链接:https://download.csdn.net/download/weixin_

    2024年02月12日
    浏览(41)
  • Unity游戏源码分享-3d机器人推箱子游戏

    Unity游戏源码分享-3d机器人推箱子游戏 一个非常意思的3D游戏    工程地址:https://download.csdn.net/download/Highning0007/88098014

    2024年02月15日
    浏览(51)
  • unity期末作业-两个简单小游戏游戏-躲避障碍和跑酷(附下载链接和gif动态图演示)

    游戏角色为一个小人,天上不时会掉落障碍物,人物撞到了会掉生命值,人物可以左右移动跳跃来躲避,带游戏音效,比较简单!具体情况如下所示: 点我下载源文件和exe导出文件》》》》》》》 角色可以上下左右移动,J发射子弹k跳跃,只有在跳板上才可以跳跃,可以吃能

    2024年02月04日
    浏览(66)
  • Unity小游戏-惊爆游戏(PC)3D联网大逃杀游戏 项目展示+完整项目源码

    1.类似吃鸡的小游戏,但是这里没有毒圈,武器只有炸弹,没有枪。 2.游戏开始后所有人的体力会不断下降,当体力下降到0就会死亡。 3.玩家只有吃食物增加体力才能活下去,而食物只能通过空投获取或者干掉其他玩家获取。(这就意味着你必须去干人,不能躲在一边苟活)

    2023年04月20日
    浏览(56)
  • 用 Unity 实现的3D横板格斗游戏(BeatEmUp)源码+可执行文件

    介绍 用 Unity 实现的3D横板格斗游戏 软件版本 Unity 2019.4.28f1c1 (64-bit) Visual Studio 2019 游戏角色 提供了两个游戏角色供玩家进行选择 两个角色在攻击、速度以及弹跳属性数值上存在差异 游戏控制 🠜 🠉 🠞 🠟 键:控制角色各方向移动 Space 键:控制角色跳跃动作 Z 键:控制角色

    2024年02月04日
    浏览(33)
  • Unity3D 爆火的休闲益智游戏工程源码/3D资源 大合集

    不定期补充新游戏工程源码!!! 博客种没有的游戏类型可以在评论区留言@我,我尽量哈~ 想要定制或代开发游戏私信我 **1、2D 关卡 益智,羊了个羊 经典玩法 下载地址:https://download.csdn.net/download/qq_43505432/89165409 游戏截图: 2、2D 第三人称 关卡 益智,控制角色飞行闯关 下

    2024年04月22日
    浏览(56)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包