百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

Unity游戏教程初步(四):3D roll a ball3

bigegpt 2024-08-20 10:56 2 浏览

前言

在上一节中,我们改进了游戏的场景,并且为球体添加了刚体组件,使其可以受到力的作用。添加了这么多物体,但却全是同一个颜色,并且游戏默认的光线也没有足够的辨识度,让人一时很难分清它们。所以,在这一节中我们将给物体加上纹理,并且修改光源。

项目需求

修改光源。

给球体及其他物体加上纹理,并且设置纹理在发生碰撞的时候变更。

修改光源

-本节相关内容请读者参考:

-https://docs.unity.cn/cn/current/Manual/Lights.html,《光源》

- https://docs.unity.cn/cn/current/Manual/class-Light.html,《Light Inspector》

之前我们说过,项目中有一个默认的光源Directional Light,也就是最基础的方向光。方向光的范围是无限大的,所以移动方向光源并不会造成场景照明情况的变化。

在默认光源的基础上,我们在平面的一个顶点处加上点光源,并微调默认光源的方向,使其相对垂直地照射平面。右击Hierarchy->Light->Point Light以添加一个点光源,或者右击Hierarchy->Create Empty创建一个空游戏对象然后给其添加Light组件,调整type为point。

新建的点光源效果如下图:

添加纹理

-本节相关内容请读者参考:

-https://docs.unity.cn/cn/current/Manual/class-TextureImporter.html,《纹理》

-https://docs.unity.cn/cn/current/Manual/TextureTypes.html,《纹理类型》

纹理在这里是一个专业术语,是指包裹在游戏对象上的图片,可以理解成游戏对象的一层皮或者一件衣服。纹理可以让游戏对象以更真实有效的形象出现在玩家面前。下图是一个Cube在添加纹理前与添加纹理后的状况对比:

为了区分出游戏的主角球体,我们需要给其添加一个纹理。选择一张图片,放到工程内的Assets文件夹下。返回工程,选中球体的Mesh Renderer组件,点击Metrials->Element 0,选中此图片。

添加完毕之后查看场景,可以看到图片已经覆盖到球体上。

修改游戏内容

-本节相关内容请读者参考:

-https://docs.unity.cn/cn/current/ScriptReference/Renderer-material.html,《Renderer.material》

还记得我们之前新放置的点光源吗?暂且将这个光源作为球体滚动的目的地,设定小球滚动到点光源照射的区域得分。但是仅仅用光源区分目的区域显然是不够的。为了区分目的区域,我们可以使用两种方法:1.新建一个平面,为其添加一个有辨识度的纹理,然后将其覆盖到目的区域。2.为平面添加一个纹理,用纹理划分目的区域。这两个方法都是可行的。

由于平面的默认长度(Scale1*1)为10,而笔者平面的位置为(0,1,-10),正对XoZ面,如果将得分区域确定为右上四分之一长度区域,目的区域平面的位置为(3.75,1,-6.25)。

添加一个空游戏对象JudgeController,搭载一个Script组件(JudgeController)作为球体位置的判断器(最好不要把判断位置部分直接加到球体的代码里,这是为了将来游戏的扩展性)。

码代码,使球体在进入目的区域时变更颜色:

JudgeController.cs

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class JudgeController : MonoBehaviour

{

    public GameObject sphere; //球体的引用

    //近点和远点分别是目的区域离原点最近和最远的点

    public  Vector3 nearP=new Vector3(2.5f,0,2.5f); //近点

    public  Vector3 farP= new Vector3(5,0,5); //远点

    // Start is called before the first frame update

    void Start()

    {

    }

    // Update is called once per frame

    void Update()

    {

        Vector3 p=sphere.GetComponent<Transform>().position; //位置

        if(p.x>nearP.x && p.x<farP.x && p.z>nearP.z &&p.z<farP.z){

            //小球中心点在目的区域内

            sphere.GetComponent<Sphere>().changeMaterial(true);  //调用Sphere的函数

        }else{

            //不在区域内,变回来

            sphere.GetComponent<Sphere>().changeMaterial(false);

        }

    }

}

可以看到上面有一个public属性sphere没有赋值,因为它引用的是游戏对象球体,要在unity中指定。保存脚本文件返回unity,可以看到在其Script组件下出现了脚本中的三个public属性,其中sphere显示为None。选择球体作为sphere的值,就达到了绑定的效果。

由于JudgeController中引用了sphere的函数changeMaterial,我们给Sphere加上这个函数:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Sphere : MonoBehaviour

{

    public Vector4 color;

    // Start is called before the first frame update

    void Start()

    {

        color=GetComponent<MeshRenderer>().material.color; //记录球体原来的颜色

    }

    // Update is called once per frame

    void Update()

    {

        float x=Input.GetAxis("Horizontal"); 

        float y=Input.GetAxis("Vertical"); //获取键盘方向键的增量

        GetComponent<Rigidbody>().AddForce(new Vector3(x,0,y)*5); //施加变更方向的力 

        //这里的xy符号取决于读者场景的摄像机和平面朝向

    }

    public void changeMaterial(bool b){ //设置为public以便调用

        //变更材质

        if(b){

            GetComponent<MeshRenderer>().material.color=new Color(0.6f,0.3f,0.6f,0.2f); //修改颜色

        }

        else{

            GetComponent<MeshRenderer>().material.color=color; //还原颜色

        }

    }

}

打开调试移动球体,效果如下:

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...