简介
这篇博客主要介绍了怎么简单的使用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
第一篇博客就写到这啦。