Unity游戏教程初步(四):光源和纹理

目录

前言

项目需求

修改光源

添加纹理

修改游戏内容


前言

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

项目需求

修改光源。

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

修改光源

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

-光源 - Unity 手册,《光源》

- 光源 - Unity 手册,《Light Inspector》

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

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

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

添加纹理

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

-Texture Import Settings - Unity 手册,《纹理》

-纹理类型 - Unity 手册,《纹理类型

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

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

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

修改游戏内容

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

-Renderer-material - Unity 脚本 API,《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; //还原颜色

        }

    }

}

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值