一、模拟太阳系
-
要求:写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,且不在一个法平面
-
实现截图如下(正在转动中):
-
为了看的更清楚,以下取消了阴影
-
主要代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SolarSystem : MonoBehaviour
{
// Start is called before the first frame update
public Transform Sun;
public Transform Mercury;
public Transform Venus;
public Transform Earth;
public Transform Mars;
public Transform Jupiter;
public Transform Saturn;
public Transform Uranus;
public Transform Neptune;
public Transform Pluto;
public Transform Moon;
void Start()
{
//初始化位置
Sun.position = Vector3.zero;
Mercury.position = new Vector3(400, 0, 0);
Venus.position = new Vector3(800, 0, 0);
Earth.position = new Vector3(1100, 0, 0);
Moon.position = new Vector3(1300, 0, 0);
Mars.position = new Vector3(1400, 0, 0);
Jupiter.position = new Vector3(1700, 0, 0);
Saturn.position = new Vector3(2200, 0, 0);
Uranus.position = new Vector3(2600, 0, 0);
Neptune.position = new Vector3(2800, 0, 0);
Pluto.position = new Vector3(3000, 0, 0);
}
// Update is called once per frame
void Update()
{
//对太阳公转
Mercury.RotateAround(Sun.position, new Vector3(0.1f, 1, 0), 410 * Time.deltaTime);
Venus.RotateAround(Sun.position, new Vector3(0, 1, -0.1f), 16 * Time.deltaTime);
Earth.RotateAround(Sun.position, new Vector3(0, 1, 0), 10 * Time.deltaTime);
Mars.RotateAround(Sun.position, new Vector3(0.2f, 1, 0), 5 * Time.deltaTime);
Jupiter.RotateAround(Sun.position, new Vector3(-0.1f, 2, 0), 15 * Time.deltaTime);
Saturn.RotateAround(Sun.position, new Vector3(0, 1, 0.2f), 21 * Time.deltaTime);
Uranus.RotateAround(Sun.position, new Vector3(0, 2, 0.1f), 30 * Time.deltaTime);
Neptune.RotateAround(Sun.position, new Vector3(-0.1f, 1, -0.1f), 5 * Time.deltaTime);
Pluto.RotateAround(Sun.position, new Vector3(0, 2, 0.1f), 2 * Time.deltaTime);
//自转
Sun.Rotate(Vector3.up * 3531 * Time.deltaTime);
Mercury.Rotate(Vector3.up * 61 * Time.deltaTime);
Venus.Rotate(Vector3.up * 15 * Time.deltaTime);
Mars.Rotate(Vector3.up * 3600 * Time.deltaTime);
Jupiter.Rotate(Vector3.up * 3545 * Time.deltaTime);
Earth.Rotate(Vector3.up * 9095 * Time.deltaTime);
Saturn.Rotate(Vector3.up * 8521 * Time.deltaTime);
Uranus.Rotate(Vector3.up * 5041 * Time.deltaTime);
Neptune.Rotate(Vector3.up * 5549 * Time.deltaTime);
Pluto.Rotate(Vector3.up * 600 * Time.deltaTime);
//月球绕地公转
Moon.transform.RotateAround(Earth.position, new Vector3(0, 1, 0), 120 * Time.deltaTime);
}
}
-
资源来自: Solar Textures (包括行星贴图和太空贴图)
-
值得一提的是,笔者精心设计的数据没有派上用场,哭了…
- 具体原因是,真实的太阳系尺度下,根本看不出模拟的效果,所以后面稍微调整了以下各个行星和太阳的尺寸关系,不过各个行星之间的大小关系仍按照实际比例
- 具体参考视频:耗时一天,我在Unity里复原了真实比例的太阳系行星模型,真的和教科书不一样
二、牧师与魔鬼
1.先放上游戏截图
- 游戏视频:
- 成功通关版: Unity3D-牧师与魔鬼小游戏成果展示
- 通关失败版: Unity3D-牧师与魔鬼小游戏成果展示(通关失败版)
2.其实是不要求美工,因为本质上都是使用预制件,但是笔者比较喜欢这方面的工作,所以简单下载了一些资源,并且加上天空盒就会有上面这个效果啦
资源如下:
- Boast Park:里面有各种各样的船
- Easy Primititive People:里面是各种样式的圆柱形人物
- Fantasy Skybox FREE:里面是各种精美的天空盒,也是老师上课讲到的资源
- LowPoly Water:提供低精度的水的材质
3.游戏规则
动作 | 条件 |
---|---|
开船 | 船上必须有一个角色,船必须处于靠岸状态 |
角色上船 | 船停靠的岸上必须有该角色,且船有空位 |
角色下船 | 船停靠在岸边,且船上有该角色 |
4.MVC 结构
- M(Model): 牧师,魔鬼,船,两岸,河;全都受Controller控制。
- V(View): 点击角色移动,点击船移动,即UserGUI和ClickGUI,用来展示交互结果。
- C(Controller): GameController、BoatController、CoastController、PAndVController,其中GameController控制着这个场景中的所有对象,包括其加载、通信、用户输入。
- Director类,还有最高层的Controller, 一个游戏中只能有一个实例,它控制着场景的创建、切换、销毁、游戏暂停、游戏退出等等最高层次的功能。
- 注:这里的PAndVController应是Prests and Devils的意思,但是笔者编程的时候记错英文单词了…
5.游戏实现
1.脚本如下
2.预制件如下
3.具体代码实现在Github上
- 代码中有详细注释