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

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

首页休闲益智ROLL 3D更新时间:2024-04-24
前言

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

项目需求

修改光源。

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

修改光源

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

-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; //还原颜色 } } }

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

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved