【Unity3D】实现太阳系

摘要:
大多数参数指的是太阳系的参数,例如行星的大小、转速等。最后,将整个太阳拖到资产/资源/Perfabs中,在这里进行准备。2.开始编写代码~创建RoundSun。课程中使用MVC架构的cscs文件:2.1声明对象publicTransformSun;publicTransformMercury;publicTransformVenus;publicTransformEarth;publicTransformMoon;publicTransformMars;publicTransformJupiter;publicTransformSaturn;公共转变天王星;publicTransformNeptune;publicTransformPluto;2.2初始行星位置无效开始(){太阳位置=矢量3;零;水星位置=新矢量3;金星位置=新向量3;地球位置=新的矢量3;月球位置=新载体3;火星位置=新新矢量3,木星位置=新维矢量3;土星位置=新Vector3;天王星位置=新Vector3;海王星位置=新媒体3;冥王星位置=新媒介3;}2.3手动设置行星旋转和旋转参数,与真实太阳系的偏差无效更新(){Vector3a1=newVector3;Vector3a2=newVector 3;Vector 3a3=newVectors3;Vectors3a4=newVector3;Vector3a5=newvector 3;vector 3a6=newVecor3;Vectora3a7=newVecor 3;Vecto3a8=newVecto3;Vectoria3a9=newVectoria3;水星.自转;水星.公转;金星.自转;金星.公转声音;土星。旋转天王星。旋转;天王星。旋转海王星。旋转;海王星。旋转冥王星。旋转;冥王星。旋转;}此时,直接将cs装载到Sun,您可以在这里运行它。

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

    法平面是指过空间曲线的切点,且与切线垂直的平面。要求不在一个法平面内,则在保证所有行星以及太阳在一条轴上时,另外两条轴的比例不相同即可。公转速度在RotateAround参数里面设置。如:

【Unity3D】实现太阳系第1张

    这个程序在课堂程序的基础上完成,使用了预制、动态生成对象,在位置上使用Vector3定好行星初始位置,使用RotateAround设置行星公转,使用Rotate设置行星自转。参数大部分参照了太阳系的参数,如行星大小,公转速度等按比例模拟。

显示效果:

【Unity3D】实现太阳系第2张


制作概述:

1.制作太阳系预制

【Unity3D】实现太阳系第3张

根据太阳系各行星的大小设置Transform中的Scale

【Unity3D】实现太阳系第4张

想要给白色的球贴上图的,可以去网上找到太阳系贴图,直接百度搜索就好。

然后导入图片资源,再将对应的图片拖到对应的行星即可。

最后将Sun整个拖入Assets/Resources/Perfabs(这一步是为了后续改进,直接放在Hierarchy里面后面再挂载cs文件就可以直接运行)

【Unity3D】实现太阳系第5张

到这预制就做好啦~

2.开始编写代码~

使用了课程中的MVC架构

新建一个RoundSun.cs

cs文件:

2.1声明对象

    public Transform Sun;
    public Transform Mercury;
    public Transform Venus;
    public Transform Earth;
        public Transform Moon;
    public Transform Mars;
    public Transform Jupiter;
    public Transform Saturn;
    public Transform Uranus;
    public Transform Neptune;
    public Transform Pluto;

2.2初始行星位置

void Start () {
        Sun.position = Vector3.zero;
        Mercury.position = new Vector3 (4, 0, 0);
        Venus.position = new Vector3 (6, 0, 0);
        Earth.position = new Vector3 (8, 0, 0);
            Moon.position = new Vector3 (10, 0, 0);
        Mars.position = new Vector3 (12, 0, 0);
        Jupiter.position = new Vector3 (16, 0, 0);
        Saturn.position = new Vector3 (20, 0, 0);
        Uranus.position = new Vector3 (24, 0, 0);
        Neptune.position = new Vector3 (28, 0, 0);
        Pluto.position = new Vector3 (32, 0, 0);
    }

2.3设置行星公转和自转

手动设置的参数,与真实太阳系有偏差

void Update () {
        Vector3 a1 = new Vector3 (0, 9, 2);
        Vector3 a2 = new Vector3 (0, 257, 135);
        Vector3 a3 = new Vector3 (0, 45, 339);
        Vector3 a4 = new Vector3 (0, 4, 9);
        Vector3 a5 = new Vector3 (0, 8, 19);
        Vector3 a6 = new Vector3 (0, 11, 9);
        Vector3 a7 = new Vector3 (0, 6, 137);
        Vector3 a8 = new Vector3 (0, 3, 13);
        Vector3 a9 = new Vector3 (0, 13, 122);
        
        Mercury.RotateAround (Sun.position, a1, 20*Time.deltaTime);
        Mercury.Rotate (Vector3.up*50*Time.deltaTime);

        Venus.RotateAround (Sun.position, a2, 10*Time.deltaTime);
        Venus.Rotate (Vector3.up*30*Time.deltaTime);

        Earth.RotateAround (Sun.position, a3, 10*Time.deltaTime);
        Earth.Rotate (Vector3.up*30*Time.deltaTime);
        Moon.transform.RotateAround (Earth.position, Vector3.up, 359 * Time.deltaTime);

        Mars.RotateAround (Sun.position, a4, 8*Time.deltaTime);
        Mars.Rotate (Vector3.up*30*Time.deltaTime);

        Jupiter.RotateAround (Sun.position, a5, 7*Time.deltaTime);
        Jupiter.Rotate (Vector3.up*30*Time.deltaTime);

        Saturn.RotateAround (Sun.position, a6, 6*Time.deltaTime);
        Saturn.Rotate (Vector3.up*30*Time.deltaTime);

        Uranus.RotateAround (Sun.position, a7, 5*Time.deltaTime);
        Uranus.Rotate (Vector3.up*30*Time.deltaTime);

        Neptune.RotateAround (Sun.position, a8, 4*Time.deltaTime);
        Neptune.Rotate (Vector3.up*30*Time.deltaTime);

        Pluto.RotateAround (Sun.position, a9, 3*Time.deltaTime);
        Pluto.Rotate (Vector3.up*30*Time.deltaTime);
    }

这时候直接将cs挂载到Sun里,到这里已经可以运行实现啦。


接下来实现预制,动态生成对象吧。直接放代码。

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

public class FirstController : MonoBehaviour, ISceneController {
    void Awake() {
        Debug.Log ("load sunt...
");
        SSDirector director = SSDirector.getInstance ();
        director.setFPS (60);
        director.currentSceneController = this;
        director.currentSceneController.LoadResources ();
    }

    public void LoadResources() {
        GameObject sunset = Instantiate<GameObject> (
                                Resources.Load <GameObject> ("Perfabs/Sun"),
                                Vector3.zero, Quaternion.identity);
        sunset.name = "sunset";
        Debug.Log ("load sunset...
");
    }
    public void Pause(){
    }
    public void Resume(){
    }
    // Use this for initialization
    void Start () {
        
    }
    
    // Update is called once per frame
    void Update () {
        
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public interface ISceneController {
        void LoadResources();
        void Pause();
        void Resume();
    }
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SSDirector : System.Object {
    private static SSDirector _instance;

    public ISceneController currentSceneController { get; set; }
    public bool running{ get; set; }

    public static SSDirector getInstance() {
        if (_instance == null) {
            _instance = new SSDirector ();
        }
        return _instance;
    }

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

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

在确保【Unity3D】实现太阳系第6张

在这个文件目录下

将FirstController挂载到主摄像机或者空对象即可运行

 大致架构:

【Unity3D】实现太阳系第7张

免责声明:文章转载自《【Unity3D】实现太阳系》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇htpasswd命令C++ 判断进程是否存在下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF 解决文本框设置了阴影效果后,因左右的transform变化引发的拉伸渲染问题

背景 最近遇到一个动画执行时,文本位置变化的问题。如下图: 如果你仔细看的话,当星星变小时,文本往下降了几个像素。 貌似有点莫名其妙,因为控件之间并不在同一个Panel布局控件中,不存在高度限制变化引发此类问题。所以有了如下测试 测试场景 字体类型影响 1. 首先新建了一个空项目,前面是一个带阴影的文本,后面用一张普通图片循环变更它的高度。尝试了下,还是...

利用Microsoft.Practices.Unity的拦截技术,实现.NET中的AOP

1、记住这个单词的意思:Interception(拦截) 2、首先说一下原理和背景   原理:所谓的AOP就是面向切面编程,这里不多说,百度搜索。   目的:个人认为是为了解耦,部分代码跟业务代码分离,业务代码里面不掺杂其它功能,比如:记录异常、记录操作日志。   背景:项目基本功能已完成,产品要求记录用户的操作日志,新增的时候记录某人在某时做了某事(包括...

Unity Kajiya Hair Shader Mod by Normals

Shader "HairShader" { Properties { _MainTex ("Diffuse (RGB) Alpha (A)", 2D) = "white" {} _Color ("Main Color", Color) = (0,0,0,1) _SpecularTex ("Specular (R) Gloss (G) Anisotro...

Unity3d dll 热更新 基础框架

APK包装到用户手机上后,代码如何更新,总不能全用LUA吧?特别是代码非常多的战斗手游 昨晚上有了dll 热更新的想法,今天做了一天的实验,也遇到些坑,这里总结下 工作环境: U3D5.3.2 + vs2010 +mono 下面要模拟的是一个登陆环境,点击按钮,就加载一个iGameObjec的Item,  Item 上得到更新的文本内容。具体如下图 1&g...

Unity消息简易框架 Advanced C# messenger

Unity消息简易框架 Advanced C# messenger Unity C# 消息机制  【转载 雨凇MOMO博客】 https://www.xuanyusong.com/archives/2165 Tips 在寻找Unity下好用的消息事件框架的时候无意中发现该框架,十分简易,但又用起来特别方便。公司VR游戏中试了下,真滴方便。也不造轮...

Unity中嵌入网页插件Embedded Browser2.1.0

背景 最近刚换了工作,新公司不是做手游的,一开始有点抵触,总觉得不是做游戏自己就是跨行了,认为自己不对口,但是慢慢发现在这可以学的东西面很广,所以感觉又到了打怪升级的时候了,老子就在这进阶了。 一进公司他们使用H5开发,做一款地形信息系统的软件,基于Unity开发,但是所有页面都是Js写的,所以我第一件事要做的是实现Unity嵌入网页,并实现交互。 在这里...