在上一节中,我们改进了游戏的场景,并且为球体添加了刚体组件,使其可以受到力的作用。添加了这么多物体,但却全是同一个颜色,并且游戏默认的光线也没有足够的辨识度,让人一时很难分清它们。所以,在这一节中我们将给物体加上纹理,并且修改光源。
项目需求修改光源。
给球体及其他物体加上纹理,并且设置纹理在发生碰撞的时候变更。
修改光源-本节相关内容请读者参考:
-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