3D小球跑酷

目录

一、前言

二、开发环境

三、场景搭建

        1. 创建项目

        2. 创建场景内物体

   2.1 创建跑道        

   2.2 创建玩家

   2.3 创建障碍物

   2.4 改变跑道和障碍物的颜色

         2.4.1 创建材质

         2.4.2 给跑道和障碍物更换材质

四、功能脚本实现

        1. 创建玩家脚本

2. 相机跟随

3. 胜负的判定

    3.1 游戏失败

           3.1.1 碰撞到障碍物

            3.1.2  小球掉下跑道

            3.1.3  重新开始游戏

    3.2 游戏胜利

           3.2.1 给空物体添加脚本

五、结束语


一、前言

        本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。

        游戏中,小球会以恒定的速度向前运动。玩家通过控制小球左右移动来避开小球在前进路上的障碍物。如果玩家控制小球一直向前跑,一定距离后则认定玩家取得胜利。当玩具在取得胜利前,碰到路上的障碍物或者跌落路面,游戏失败。

二、开发环境

操作系统:Windows

Unity 版本:2021.3.11f1c2 LTS

三、场景搭建

       1. 创建项目

        1.1 打开Unity Hub,在Project标签下,点击右上角 New project 按钮。打开新建项目对话框。

        1.2 在新建项目窗口中,选择3D 模板,填入项目名称 BallRun,选择项目保存的位置,取消版本控制选项的对钩,点击 Create project 按钮,完成项目创建。

      2. 创建场景内物体

       2.1 创建跑道

        在场景中新建一个 Cube(立方体),重命名为Road,并将其长度设定为1000, 宽度改为8,然后将其位置向前移动480,此作为小球的跑到,如图。

        2.2 创建玩家

        新建一个小球(Sphere)作为玩家,重命名为Player,并放在道路上,调整到合适的位置。(小提示:按住Ctrl建拖拽,可以更好的控制小球的位置)

        2.3 创建障碍物

        新建若干个Cube(立方体)作为障碍物,并重命名为Barrier,调整障碍物的大小并放到合适的位置。因为要创建多个障碍物,为了以后使用方便,我们可以把障碍物做成预制体,这样我们就可以重复使用这个预制体了。

        在Project窗口下,新建文件夹并命名为 Prefabs,然后把 新建的障碍物(Cube)直接拖到Prefabs 目录下,这样预制体就做好了。

        在Hierarchy窗口中选中障碍物(Barrier), 按住Ctrl+D, 复制多个物体,并调整他们到合适的位置,完成小球前进路上障碍物的设置。最终效果如图:

       2.4 改变跑道和障碍物的颜色

        现在,我们看到场景里的小球、道路和障碍物都是白色的,为了更好的区分,我们更改一下道路和障碍物的颜色。更改3D物体的颜色,我们可以通关修改3D物体材质的颜色来改变物体的颜色。

        选中物体,我们发现道路和障碍物使用的默认材质并不能直接修改颜色,因此我们需要自己创建跑道和障碍物的材质。

        2.4.1 创建材质

        在Project窗口下新建文件夹,命名为Materials,用来保存我们自己创建的材质。在Materials文件夹内右键,依次选择 Create -> Material,将新建的Material命名为Road,并调整其颜色为深灰色(颜色值为:201E1E)。用同样的方式创建障碍物的材质,命名为Barrier,并调整其颜色为浅灰色(颜色值:A49898)。( 读者也可以调整为自己喜欢的颜色,颜色主要为了更好地区分场景内的物体,提高用户游戏体验)

        2.4.2 给跑道和障碍物更换材质

        将我们创建的材质Road,直接拖拽到 Hierarchy 窗口的Road物体上,可以看到跑道的颜色以已经改变。用同样的方式,更换障碍物的材质。

小提示:

由于障碍物是使用的预制体,因此,我们选中预制体,直接把Barrier材质拖到预制体上,这样场景中的所以物体都会改变。这就是使用预制体的好处。

最终效果如图:

好了,到此为止,我们的场景就算搭建完了,下面我们就要进行功能的实现了。

四、功能脚本实现

        在Project窗口中新建文件夹Scripts,用来保存我们的脚本文件。

        1. 创建玩家脚本

        和创建材质一样,在Scripts文件夹右键,依次点击 Create -> C# Script,并命名为Player。将创建的Player脚本拖拽到 Hierarchy 窗口的Player物体上,如图:

        双击打开Player脚本,输入以下代码,其中,speed 是小球向前跑的速度,是一个恒定值,默认为10;turnspeed 是玩家控制小球时,小球左右移动的速度。

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

public class Player : MonoBehaviour
{
    public float speed = 10f;
    public float turnSpeed = 5f;

    void Update()
    { 
        float turnX = Input.GetAxis("Horizontal");
        transform.Translate(turnX * turnSpeed * Time.deltaTime, 0, speed * Time.deltaTime);
    }
}

        运行游戏,发现小球开始向前跑,当按下键盘上的左右方向键或者A/D键的时候,小球会左右移动。

        如果感觉速度不合适,可以通过 Inspector 面板对速度进行调节,如图:

        但是在运行时,我们发现,小球会越跑越远,慢慢的就超出我们是视线了,而我们平时玩的跑酷都是一直在视线内。接下来我们就实现相机的跟随。

        2. 相机跟随

        其实,实现相机的跟随有两种方式,一种是利用脚本控制相机的位置,使相机和小球一直保持一定的相对位置。另一种则更为简单,直接把相机作为小球的子物体,这样小球在移动的时候,相机也会跟着一起移动。这里我们采用第二种方式。

        在Hierarchy窗口中拖到相机(Main Camera)到小球(Player)底下。再次运行游戏看下效果,相机一直跟随小球运动了。

        3. 胜负的判定

        当小球碰撞到障碍物或者掉落到跑道之外的时候,游戏失败。当小球一直未碰到障碍物,一段距离后,判定游戏胜利。

        为方便管理,我们将场景中的障碍物都放到一个空物体下。在Hierarchy窗口右键,点击 Create Empty, 创建一个空物体,命名为Barriers,然后选中所有的障碍物,拖动到空物体(Barriers)下。

       3.1 游戏失败
       3.1.1 碰撞到障碍物

        在Scripts文件夹下新建脚本Barrier.cs文件,然后把脚本拖拽到预制体Barrier之上。选中Barrier预制体,勾选预制体上Box Collider的Is Trigger 选项。

        双击Barrier.cs文件,在脚本中输入以下代码:


using UnityEngine;

public class Barrier : MonoBehaviour
{
    void OnTriggerEnter(Collider other)
    {
        if (other.name == "Player")
        {
            Debug.Log("游戏失败");
            Time.timeScale = 0;  // 游戏停止
        }
    }
}

小提示:

        Time.timeScale表示游戏的运行时间倍率,设置为0即表示游戏里的时间停滞,1即正常的时间流逝速度,2即两倍于正常的时间流逝速度,以此类推。

        在Hierarchy窗口中选中小球(Player),添加Rigid Body 组件。然后保存,运行游戏,当小球碰到障碍物的时候,游戏便会停止。 

        3.1.2  小球掉下跑道

        双击打开Player.cs脚本,在Update方法里继续补充小球掉下跑道的逻辑。由于跑道的宽度是8,所以跑道的左边缘为-4,右边缘是4. 小球超出边缘后,直接掉落,在掉落一段距离(此处设置的是20)后,判定游戏结束。

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

public class Player : MonoBehaviour
{
    public float speed = 10f;
    public float turnSpeed = 5f;

    void Update()
    { 
        float turnX = Input.GetAxis("Horizontal");
        transform.Translate(turnX * turnSpeed * Time.deltaTime, 0, speed * Time.deltaTime);

        // 小球的位置超出跑道的边缘,则直接掉落
        if(transform.position.x<-4||transform.position.x>4)
        {
            transform.Translate(0, -10 * Time.deltaTime, 0);
        }

        // 下落一定距离之后游戏结束
        if(transform.position.y<-20)
        {
            Debug.Log("游戏结束");
            Time.timeScale = 0;
        }

    }
}

        保存脚本,运行游戏,则小球超出边缘后会垂直下落,一段距离后游戏停止。

        3.1.3  重新开始游戏

        当游戏失败结束时应该允许玩家重新开始游戏,这里设置键盘上的R键为重置游戏的按键,在按R键后即可重新加载当前场景,重新开始游戏。

        在Player.cs脚本的 Update 方法里继续添加代码。注意:这次是添加在前面,注意引入命名空间 using UnityEngine.SceneManagement;

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


public class Player : MonoBehaviour
{
    public float speed = 10f;
    public float turnSpeed = 5f;

    void Update()
    { 
        // 按键盘上的R键,重新开始游戏
        if(Input.GetKeyDown(KeyCode.R))
        {
            SceneManager.LoadScene(0); // 重新加载场景
            Time.timeScale = 1;
            return;
        }


        float turnX = Input.GetAxis("Horizontal");
        transform.Translate(turnX * turnSpeed * Time.deltaTime, 0, speed * Time.deltaTime);

        // 小球的位置超出跑道的边缘,则直接掉落
        if(transform.position.x<-4||transform.position.x>4)
        {
            transform.Translate(0, -10 * Time.deltaTime, 0);
        }

        // 下落一定距离之后游戏结束
        if(transform.position.y<-20)
        {
            Debug.Log("游戏结束");
            Time.timeScale = 0;
        }

    }
}
        3.2 游戏胜利

        当小球跑一段距离后,我们判定游戏胜利,因此我们需要在跑道上建一个空的物体,作为小球胜利的终点。这个空的物体和障碍物一样,只是它看不见,仅仅作为小球胜利的触发器。

        我们在跑道上新建一个空物体。在Hierarchy窗口,右键->Create Empty。将空物体命名为Victory,点击Add Component 按钮,添加Box Collider组件,调整空物体的大小和位置(位置可以自己设定),同时勾选空物体Box Collider 上的Is Trigger 复选框,使空物体变成触发器。如图:

        3.2.1 给空物体添加脚本

        在Scripts文件夹下,新建脚本文件,命名为Victory,作为小球胜利的逻辑脚本。把Victory脚本挂载到空物体上(直接把脚本拖到空物体上即可)。双击打开Victory脚本,编写胜利逻辑。

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

public class Victory: MonoBehaviour
{
    private void OnTriggerEnter(Collider other)
    {
        if (other.name == "Player")
        {
            Debug.Log(" 恭喜胜利! ");
            Time.timeScale = 0;
        }
    }
}

        保存脚本,运行游戏。至此,这个小游戏的基本代码就完成了。

五、结束语

        本案例作为初级游戏案例,意在使初级开发者可以快速的上手一款游戏的开发,了解Unity开发游戏的便捷,培养初级开发者对游戏开发的兴趣。

        作为初级开发者案例,本案例还有许多不足和可以改进的地方,比如可以增加按上键使小球跳跃、增加音乐音效、增加金币、积分,更进一步可以做出胜利和失败的UI界面,这些都可以留待读者自行添加。

        最后,希望本案例能对您有所帮助或有所启迪,在游戏开发的道路上,做出自己喜欢的游戏。

        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepLabV3+实现sar影像海面溢油区识别

今天我们分享DeepLabV3的sai影像水体提取。 数据集 本次使用的数据集是Deep-SAR Oil Spill (SOS) dataset。该数据集由中国地质大学的朱祺琪团队制作并共享。该数据集包含墨西哥湾溢油区域和波斯湾溢油区域&#xff0c;分别获取于ALOS 和Sentinel-1A卫星。由ECHO研究组搜集制作…

phpmyadmin4.8.1远程文件包含漏洞 [GWCTF 2019]我有一个数据库1

打开题目 我们用dirsearch扫描一下后台看看 扫描结果如下 我们访问一下robots.txt看看&#xff0c;提示有phpinfo.php 那我们访问一下phpinfo.php 发现没有任何信息后我们转去看看phpmyadmin看看 成功访问到页面 在这里我们看到phpmyadmin的版本号是4.8.1 我们百度搜索一下看…

ABAP与HANA集成 2:ABAP调用HANA存储过程或SQL语句

作者 idan lian 如需转载备注出处 需求 虽然是做BW模块&#xff0c;但是最近项目上种种&#xff0c;都需要给ABAP人员或者前台用户提供能供他们使用的表&#xff0c;就稍微研究了下ABAP和HANA的集成问题&#xff0c;因为我们BW更擅长的还是HANA&#xff0c;而且HANA的运行效…

使用JS来监控前端页面的性能!

说起性能测试, 我们很多时候都在说后端, 前端的性能测试, 我们关注较少. 那我们今天就来讨论一下如何来监控前端的性能.window.performance 是W3C性能小组引入的新的API&#xff0c;目前IE9以上的浏览器都支持。一个performance对象的完整结构如下图所示&#xff1a;memory字段…

【Spark-ML源码解析】Word2Vec

前言 在阅读源码之前&#xff0c;需要了解Spark机器学习Pipline的概念。 相关阅读&#xff1a;SparkMLlib之Pipeline介绍及其应用 这里比较核心的两个概念是&#xff1a;Transformer和Estimator。 Transformer包括特征转换和学习后的模型两种情况&#xff0c;用来将一个DataFr…

FastAdmin 的 icon (图标)文档

FastAdmin 的 icon &#xff08;图标&#xff09;文档 FastAdmin的icon使用的是font-awesome&#xff0c;凡是font-awesome的图标均可使用。 点击打开font-awesome的网址 js中的icon填写

自定义maven插件

maven插件简介 一般的maven插件使用时需要引入插件的gav(groupId,artifactId,version)就可以正常使用了。一般的结构如下&#xff1a; 包含插件的gav,还有一组可执行器<execution>。在每个<execution>里面包含有如下结构 一个可执行器的结构如上&#xff0c;其中各…

系统设计架构——互联网案例

Netflix 的技术栈 移动和网络:Netflix 采用 Swift 和 Kotlin 来构建原生移动应用。对于其 Web 应用程序,它使用 React。 前端/服务器通信:Netflix 使用 GraphQL。 后端服务:Netflix 依赖 ZUUL、Eureka、Spring Boot 框架和其他技术。 数据库:Netflix 使用 EV 缓存、Cas…

【线性代数】两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗?

一、问题 两个向量组等价,其中一个向量组线性无关,另一个向量组也是线性无关吗? 二、答案 不一定,当两个向量组中的向量个数也相同时,结论才成立.若向量个数不相同,结论不成立. 例如&#xff1a; 向量组一&#xff1a;(1,0),(0,1) 向量组二&#xff1a;(1,0),(0,1),(1,1) 两…

超结MOS/低压MOS在5G基站电源上的应用-REASUNOS瑞森半导体

一、前言 5G基站是5G网络的核心设备&#xff0c;实现有线通信网络与无线终端之间的无线信号传输&#xff0c;5G基站主要分为宏基站和小基站。5G基站由于通信设备功耗大&#xff0c;采用由电源插座、交直流配电、防雷器、整流模块和监控模块组成的电气柜。所以顾名思义&#xf…

HarmonyOS应用开发实战—开箱即用的活动创建页面【ArkTS】【鸿蒙专栏-33】

一.HarmonyOS应用开发实战—开箱即用的个人主页页面【ArkTS】【鸿蒙专栏-32】 1.1 项目背景 HarmonyOS(鸿蒙操作系统)是华为公司推出的一种分布式操作系统。它被设计为一种全场景、全连接的操作系统,旨在实现在各种设备之间的无缝协同和共享,包括智能手机、平板电脑、智能…

安防监控EasyCVR平台如何通过api接口设置实时流的sei数据实现画框等操作?

国标GB28181视频监控系统EasyCVR平台采用了开放式的网络结构&#xff0c;支持高清视频的接入和传输、分发&#xff0c;能提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0…

【Transformer框架代码实现】

Transformer Transformer框架注意力机制框架导入必要的库Input Embedding / Out EmbeddingPositional EmbeddingTransformer EmbeddingScaleDotProductAttention(self-attention)MultiHeadAttention 多头注意力机制EncoderLayer 编码层Encoder多层编码块&#xff0f;前馈网络层…

mvn 指令报错 环境变量没问题----- jdk版本问题

有一个文件夹&#xff0c;里面mvn指令不能使用。mvn -version都会报错&#xff1a; 使用绝对地址也无法&#xff0c;设置权限也无法&#xff0c;到其上一层文件就可以正常使用。 于是我另外创建了个文件夹&#xff0c;把这个文件夹的所有东西全部复制进去&#xff0c;然后一个…

SpringBoot前后端分离开发项目部署时,项目打包准备工作

第一步&#xff1a;项目打包之前&#xff0c;拉前后端代码 拉完代码后&#xff0c;再执行下面操作&#xff08;确保项目能正常启动并运行&#xff09; 后端&#xff08;执行如下操作&#xff09; mvn clean install -T 8 -Dmaven.test.skiptrue -Dmaven.compile.forktrue 执行…

外汇天眼:在交易中有多少属于你的行情?

期货、股票、外汇不同的市场有着不同的特性&#xff0c;就一个市场而言&#xff0c;也不会是每一段行情都适合你。 新手完全是靠冲动和情绪交易 刚刚进入期货、股票、外汇市场的朋友都会被其巨大的财富效应所震慑&#xff1a;还有这样赚钱的&#xff1f; 而且机会比比皆是&am…

多个描述文件对开发者证书有影响吗

在开发iOS应用程序时&#xff0c;开发者证书是用于签名应用程序的关键工具。这一步骤保证了应用程序的合法性和安全性&#xff0c;避免了恶意篡改和未经授权的访问。那如果有多个描述文件会对开发者证书有影响吗。下面我简单的讲解一下他们之间的关系跟有什么影响。 首先&…

【STM32入门】4.2对射红外传感器计次

1.接线方式 主要是编写传感器的驱动、配合OLED&#xff0c;每遮挡对射红外传感器&#xff0c;OLED屏幕的计数就加一。 2.驱动编写 首先新建.c文件和.h文件&#xff0c;命名为CountSensor 国际惯例&#xff0c;.c文件内要包含stm32.h头文件&#xff0c;然后编写 CountSensor_…

3ds Max渲染贴图丢失?这样操作就能搞定!

当你在使用3ds Max进行渲染时&#xff0c;有时候会遇到贴图丢失的问题&#xff0c;导致模型无法正常显示。这可能是因为你在导入模型或添加贴图时出现了一些错误。不过不用担心&#xff0c;接下来我将向你解释这个问题可能出现的几种原因&#xff0c;同时提供有效的解决方案。 …

【力扣100】226.翻转二叉树

添加链接描述 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def invertTree(self, root: Optional[TreeN…