Unity3d入门作——做一个简单的太阳系(一)

简介

这篇博客主要介绍了怎么简单的使用Unity3d来搭建一个简单的太阳系,以及做一个学习记录,分享一下学习Unity3d的心得。
使用工具:Unity3d 5.5

实现

1.材料的管理

先是界面的选择吧,这里我选的是“2 by 3”的界面,我觉得这个界面的好处就是,能尽可能的把所有的工作窗口显示出来吧。(其实是被同学安利的= =),至于怎么调,下图已说明:
这里写图片描述
由于行星大多数都是属于球体,所以我们要新建一个球,新建的方法如下:
这里写图片描述
新建完成之后,就可以在Scene界面跟Game界面见到这个球了。改名什么的也比较容易,在这就不说了。
然后就是将贴图贴在球上,让它看起来更加的真实。这里我选了地球来做例子(谁叫我是地球人呢(笑))
这里写图片描述
在这个图片里,有几个属性是需要我们去了解的,先是Inspector,只要你点击了球的对象,那么Inspector就会有它的属性显示出来,这里就能改变它的属性,比如说Transform属性下的Position(位置),Rotation(转向),Scale(放大倍数)。至于其它属性,在此篇博客上没有用到,至于以后用到的时候,会说的。然后就是最右边用来表示该工程的文件的Assets文件夹,上课听了老师说,文件的存放最好是按照类别来存放,这样才不会使得文件类型变得混乱。一般就是Materials,Resources,Scripts三个文件夹,然后Materials是用来存放对象的材料的,而Resources就是用来存放资源,例如:Prefabs(预设)之类的东西,然后剩下的Scripts就是用来放置游戏脚本的。至于太阳系的Materials,在博客的最后面我会给出。
然后,你只需要把Materials里面的地球贴图拖到你要的球体上,你就得到一个地球(模型)啦。
这里写图片描述
然后,在这里要做一件重要的事情就是,你需要把你的地球模型,拖到Prefabs上,这是因为,当你的游戏做大之后,你会有许多的对象,假如你的对象都在Hierarchy上的话,这会使得对象十分的混乱,为了整洁,将其拖到Prefabs上是个很好的解决方法,Hierarchy窗口只留下一些比较重要的对象就行了。至于剩下的星球,重复前面的工作,就可以制作出所有的球体啦。
然后我们再创建一个空的对象,并把他命名为Main,用来搭载我们的游戏模型,以及脚本,而游戏对象的预制则由脚本生成,这样的管理方便我们的对象。然后把对象清除,保留预制就行了。
这里写图片描述
界面是十分的简洁的,只有摄像机,灯光和控制游戏的脚本。
然后,我们就要编辑脚本了。

2.脚本的编辑

先在Scripts文件夹创建两个脚本文件,Controller跟Director,其实Unity的脚本可以用两种语言来写,分别是JavaScript跟C#,因为上课用的是C#,这里也就用C#来写了。

Director.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Director : System.Object {

    //singlton instance
    private static Director _instance;

    public ISceneController currentSceneController { get; set; }

    // get instance anytime anywhere!
    public static Director getInstance() {
        if (_instance == null) {
            _instance = new Director ();
        }
        return _instance;
    }

    public int getFPS() {
        return Application.targetFrameRate;
    }

    public void setFPS(int fps) {
        Application.targetFrameRate = fps;
    }


    public interface ISceneController {
        void LoadResources();
        void Pause();
        void Resume();
    }
}

Controller.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Controller : MonoBehaviour, Director.ISceneController {

    // the first scripts
    void Awake() {
        Director director = Director.getInstance ();
        director.setFPS (60);
        director.currentSceneController = this;
        director.currentSceneController.LoadResources ();
    }
    Transform Sun;
    Transform Mercury;
    Transform Venus;
    Transform Earth;
    Transform Mars;
    Transform Jupiter;
    Transform Saturn;
    Transform Uranus;
    Transform Neptune;
    // Loading resources for first scence
    public void LoadResources() {
        Sun = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Sun"),
            Vector3.zero, Quaternion.identity);
        Mercury = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Mercury"),
            new Vector3 (2, 0, 0), Quaternion.identity);
        Venus = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Venus"),
            new Vector3 (4, 0, 0), Quaternion.identity);
        Earth = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Earth"),
            new Vector3 (6, 0, 0), Quaternion.identity);
        Mars = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Mars"),
            new Vector3 (8, 0, 0), Quaternion.identity);
        Jupiter = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Jupiter"),
            new Vector3 (10, 0, 0), Quaternion.identity);
        Saturn = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Saturn"),
            new Vector3 (12, 0, 0), Quaternion.identity);
        Uranus = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Uranus"),
            new Vector3 (14, 0, 0), Quaternion.identity);
        Neptune = Instantiate<Transform> (
            Resources.Load<Transform> ("prefabs/Neptune"),
            new Vector3 (16, 0, 0), Quaternion.identity);

        //named the sphere
        Sun.name = "Sun";
        Mercury.name = "Mercury";
        Mercury.transform.parent = Sun.transform;
        Venus.name = "Venus";
        Venus.transform.parent = Sun.transform;
        Earth.name = "Earth";
        Earth.transform.parent = Sun.transform;
        Mars.name = "Mars";
        Mars.transform.parent = Sun.transform;
        Jupiter.name = "Jupiter";
        Jupiter.transform.parent = Sun.transform;
        Saturn.name = "Saturn";
        Saturn.transform.parent = Sun.transform;
        Uranus.name = "Uranus";
        Uranus.transform.parent = Sun.transform;
        Neptune.name = "Neptune";
        Neptune.transform.parent = Sun.transform;
    }

    // Use this for initialization
    void Start() {
        //give advice first
    }

    void Update() {
        Mercury.RotateAround (Sun.position, new Vector3 (0, 1, 1), 1 * Time.deltaTime);
        Mercury.Rotate (Vector3.up * 30 * Time.deltaTime);
        Venus.RotateAround (Sun.position, new Vector3 (0, 2, 1), 2 * Time.deltaTime);
        Venus.Rotate (Vector3.up * 30 * Time.deltaTime);
        Earth.RotateAround (Sun.position, new Vector3 (0, 1, 2), 10 * Time.deltaTime);
        Earth.Rotate (Vector3.up * 30 * Time.deltaTime);
        Mars.RotateAround (Sun.position, new Vector3 (0, 1, 3), 4 * Time.deltaTime);
        Mars.Rotate (Vector3.up * 30 * Time.deltaTime);
        Jupiter.RotateAround (Sun.position, new Vector3 (0, 3, 1), 5 * Time.deltaTime);
        Jupiter.Rotate (Vector3.up * 30 * Time.deltaTime);
        Saturn.RotateAround (Sun.position, new Vector3 (0, 2, 3), 6 * Time.deltaTime);
        Saturn.Rotate (Vector3.up * 30 * Time.deltaTime);
        Uranus.RotateAround (Sun.position, new Vector3 (0, 3, 2), 7 * Time.deltaTime);
        Uranus.Rotate (Vector3.up * 30 * Time.deltaTime);
        Neptune.RotateAround (Sun.position, new Vector3 (0, 1, 5), 8 * Time.deltaTime);
        Neptune.Rotate (Vector3.up * 30 * Time.deltaTime);
    }

}

(这里我用的是Unity自带的MonoDevelop代码编辑器,比VS轻量,挺好用的,推荐编辑脚本的时候可以使用这个。)
乍一看,代码貌似有点长,但其实是挺好理解的,Director脚本负责单实例模型,而Controller脚本则负责控制界面,里面LoadResources负责加载资源,Instantiate函数表示从什么地方生成一个怎样的东西。然后就给生成的球体命名。而Update函数就负责游戏的每一帧更新每一星球的位置(Update函数每一帧都会执行一次的),至于里面的Rotate跟RotateAround需要去看官方文档去学习怎么使用了。其实无非就是自身旋转跟绕某个对象旋转。里面的方向跟速度什么的都是我自己乱设的,没有什么含义,本篇博客只是先做出一个简单的太阳系,至于大小什么的,还需要调整。保存完之后,就可以在游戏编辑页面将脚本拖到我们的Main对象啦。
这里写图片描述
调整调整灯光位置和照相机的位置,然后点运行,我们的太阳系就跑起来啦。
这里写图片描述

总结

我们搭的一个简单的太阳系终于成功的跑起来啦,虽然真的是挺简单的,很多功能都没有实现,比如说,所有的星球都一样大,太阳不会发光,背景不好看等问题,但是总的来说,这个太阳系的雏形已经体现出来了,至于怎么把这个太阳系做得更加像我们的现实的太阳系,在我以后的博客里面,我会继续更新的(正经脸)。

补充

由于担心有些小伙伴看不懂英语,我在这里补充八大行星的中英文对照表(捂脸),以下的排名部分先后(笑)。

中文 英文
太阳 Sun
水星 Mercury
金星 Venus
地球 Earth
火星 Mars
木星 Jupiter
土星 Saturn
天王星 Uranus
海王星 Neptune

太阳系的贴图:https://pan.baidu.com/s/1dE9I6QX
第一篇博客就写到这啦。

没有更多推荐了,返回首页