【Unity基础】3.脚本控制物体运动&天空盒

【Unity基础】3.脚本控制物体运动&天空盒

    大家好,我是Lampard~~
    欢迎来到Unity基础系列博客,所学知识来自B站阿发老师~感谢 

 (一)搭建开发环境

(1)下载visual studio

    在我们下载unity编译器的时候,会让我们选择当前unity编译器搭配的vs编译器。我们最好就直接勾选上,或者可以自己手动下载vs,在vs的installer里勾选unity引擎开发需要的环境

(2)unity中设置脚本编译器

    下载好了之后,我们要在unity中更新vs作为脚本编译器。方式很简单,打开编译器,选择Edit -> Preferences目录 ,在 External Tools 页签里,选择 VS 作为脚本编辑器

(3)设置随脚本修改重新编译

    为了方便之后的开发调试,我们需要设置每当脚本修改了之后,unity自动帮我们编译这个脚本,让改动可以实时的生效。选择Edit -> Preferences目录 ,在 General  页签里,把Script Change While playing 选项调整为:Recompile After Finished Playing即可

(4)创建C#文件

    在Unity中,脚本也属于资源的一部分。因此我们同样的在Asserts目录下创建一个Scripts的文件夹用来存放脚本文件

    在该文件夹中右键create菜单,选择C#脚本即可生成第一个C#文件

(5)重命名C#文件

    生成的C#脚本默认命名为NewBehaviourScript,双击这个脚本,unity会自动帮我们打开vs(如果没有请重阅读上文配置)

    我们可以看到,里面存在一个同样命名为NewBehaviourScript的类,这是unity的特数规则:类名和文件名相同因此我们在重命名类名或者文件名时就不可以像以往直接rename了,我们需要在脚本中选中类名然后右键重命名,比如修改成FirstLogic,我们就可以看到脚本和类名同时发生修改

    在unity编译器中查看,也是已经同步修改过来了的

  (6)挂载脚本组件

    接下来我们只需要把脚本挂载到场景的对象中并运行就可以了(注意不挂上去的话脚本是不会生效的!)

    挂载的方式和我们之前熟悉的一样拖动过去即可,拖过去之后,会发现对象的inspector面板中多了我们的FirstLogic组件

 (二)物体运动

(1)制作一台运动的小车

    transform组件提供了一个接口Translate,帮助我们调整物体的位置,只需要传入需要变化的位置信息就可以了

    以下是Translate方法的定义:

transform.Translate是Unity引擎中Transform组件的一个方法,用于平移物体。该方法接受一个三维向量作为参数,表示需要平移的距离和方向。平移距离和方向的单位是世界坐标系中的单位

    因此我们的代码可以改成这样:

    void Update()
    {
        float DisPreSec = 6f; // 每帧运动的距离
        this.transform.Translate(0, 0, DisPreSec * Time.deltaTime);
    }

 然后把脚本拖动至小车对象上就可以了,运行看看:

(2)改变运动的朝向

    假设这台小车车有一个移动的目标,我们需要朝着红旗对象前进,驶向终点那要如何做呢?

    首先创建一个红旗对象,然后随便放置一个位置

    然后为了能使小车的车头朝向红旗,我们需要获取到红旗的位置。在获取红旗位置之前,我们就需要在脚本中先获取到红旗这个对象

    怎么做呢?可以通过GameObject.Find这个静态方法来寻得红旗

GameObject.Find是Unity引擎中的一个方法,用于查找场景中指定名称的游戏物体。该方法接受一个字符串作为参数,表示需要查找的游戏物体的名称,返回一个代表该游戏物体的GameObject对象

    而用法也很简单,直接把目标的名字传入就可以了

GameObject flag = GameObject.Find("红旗");

(3)transform.LookAt

    获取到红旗这个对象,下一步我们就可以调整车头方向了。当然我们可以通过手动计算出两个物体当前的便宜角度,但阿发老师直接给我们提供了一个更好用的接口:transform.LookAt

transform.LookAt是Unity引擎Transform组件中的一个方法,用于使物体朝向指定的目标位置。该方法接受一个三维向量作为参数,表示需要朝向的目标位置

    只需要调用这个方法,就把车头位置朝向红旗了

    void Update()
    {
        GameObject flag = GameObject.Find("红旗");
        this.transform.LookAt(flag.transform);

        Vector3 localPos = this.transform.localPosition;
        float DisPreSec = 6f;
        this.transform.Translate(0, 0, DisPreSec * Time.deltaTime);
    }

    看看效果:

(二)自转与公转

(1)地球自转

    我们学习了如何在脚本中获取物体对象,并使用transform组件下的translate接口使物体运动

    接下来我们进一步学习,用脚本控制物体的旋转

    transform组件提供了Rotate这个接口,它可以直接传入欧拉角的偏移值,我们只需要在update方法中加入旋转接口就可以实现物体自转了

    void Update()
    {
        this.transform.Rotate(0, 360 * Time.deltaTime, 0);
    }

    接下来我们想实现地月系统旋转,首先第一步就是让地球自转起来,那很简单,我们把RotateLogic脚本挂在地球上就可以了

    嗯...有点快,我们把速度调低一些。缩小个4倍吧,让它四秒转一圈,看上去好多了

 (2)月亮公转

    下一步就是实现月球的公转了,那要如何做呢?直接把RotateLogic挂给月亮也只是实现自转。这个时候我们就应该想起我们的父子关系

    如果月亮是地球的子节点,那地球转的时候就可以带动月亮转了

    但是问题来了,这样子的话月亮绕地球的转速就和地球自转的速度一样,我们知道地球一转一天,月球绕地球一周是需要27天的,速率明显不一样

    这个时候我们只需要在地球的位置挂载一个空节点作为旋转节点,调整其旋转速率,并让月亮成为它的子节点就可以了

    随便把速度设置为地球的三分一,看看效果:     

(三)天空盒

(1)天空盒Skybox

    天空盒就是3d世界里面的背景概念,我们可以想象在3d的世界中,我们就是处在一个巨大无比的矩形之中

    我们知道一个矩形是由6个面组成的,面与面之间无缝连接,那么接下来看看天空盒的图片构成

【Unity基础】3.脚本控制物体运动&天空盒_第1张图片

    我们创建的unity3d的项目中,会默认自带一个天空盒,我们可以在编辑器的这个位置控制天空盒是否显示:

(2)替换天空盒

    天空盒本质上也是一个材质,我们接下来看看它的具体构成以及要如何进行替换

【Unity基础】3.脚本控制物体运动&天空盒_第2张图片

    我们导入一个天空盒,点击可以看到,里面包含了一个天空盒材质,以及一个textures文件夹,文件夹中包含的是天空盒6个面所用到的资源

    若想要替换这个demo的天空盒,我们需要在Window餐单栏下面的Rending->Lighting子菜单,然后在Enviroment页签下,找到天空盒定义材质和纹理的地方,把我们实现准备好的天空盒材质和资源替换上去即可

【Unity基础】3.脚本控制物体运动&天空盒_第3张图片

    作为一个材质,天空盒和普通材质的差别是什么呢?我们可以看到它的shader的选项中勾选的是skybox/6个面的shader,也就是物体的表面由6个面组成

【Unity基础】3.脚本控制物体运动&天空盒_第4张图片

(3)创建天空盒

    刚才我们的天空盒材质是直接导入的,那我们可不可以自己创建一个天空盒呢?

    无疑是可以的,我们首先准备6张无缝连接的图片,导入项目中

【Unity基础】3.脚本控制物体运动&天空盒_第5张图片

     然后我们创建一个空白的材质,并把它的shader模式改成skybox/6

【Unity基础】3.脚本控制物体运动&天空盒_第6张图片

    紧接着把贴图一一对应的放置在对应的面上即可,是不是很简单~

【Unity基础】3.脚本控制物体运动&天空盒_第7张图片

 

好啦今天就到这里,感谢阅读!!!
点赞,关注!!!

你可能感兴趣的:(Unity原理,unity,游戏引擎,天空盒,脚本,物体运动)