这篇博客主要介绍了怎么简单的使用Unity3d来搭建一个简单的太阳系,以及做一个学习记录,分享一下学习Unity3d的心得。 使用工具:Unity3d 5.5
先是界面的选择吧,这里我选的是“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,用来搭载我们的游戏模型,以及脚本,而游戏对象的预制则由脚本生成,这样的管理方便我们的对象。然后把对象清除,保留预制就行了。 界面是十分的简洁的,只有摄像机,灯光和控制游戏的脚本。 然后,我们就要编辑脚本了。
先在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 第一篇博客就写到这啦。