ch03空间与运动——Unity3D学习

一、模拟太阳系

  • 要求:写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,且不在一个法平面

  • 实现截图如下(正在转动中):
    请添加图片描述

  • 为了看的更清楚,以下取消了阴影请添加图片描述

  • 主要代码:

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);

    }
}

太阳系数据图


二、牧师与魔鬼

1.先放上游戏截图

请添加图片描述

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上
  • 代码中有详细注释

代码仓库:My-priests-and-devils

猜你喜欢

转载自blog.csdn.net/yesor_not/article/details/127371112
今日推荐