Unity学习笔记(二)--空间与运动&太阳系

Part 1 简答并用程序验证

1.游戏对象运动的本质是什么?
游戏对象位置、旋转、大小的变换。
2.请用三种以上方法实现物体的抛物线运动
抛物线运动即是水平做匀速运动,垂直做加速运动
假定发射角度为45°,发射速度为10m/s
因为初速度、初方向的计算都类似,所以除了第一个代码块声明了变量和Start()方法外其他的都只写Update()方法

实现方法1:使用transform进行模拟

using UnityEngine;

using System.Collections;

public class newDus : MonoBehaviour {

    public float speed = 10;//初速度
    public float Angle = 45;//发射的角度
    public float g = -10;//这个代表重力加速度


    private Vector3 MoveSpeed;//初速度向量
    private Vector3 verticalSpeed = Vector3.zero;//重力的速度向量
    private float dTime;//已经过去的时间
    private Vector3 currentAngle;

    // Use this for initialization

    void Start(){
        MoveSpeed = Quaternion.Euler(new Vector3(0, 0, Angle)) * Vector3.right * speed;
        currentAngle = Vector3.zero;
    }

    // Update is called once per frame

    void Update()    {
        verticalSpeed.y = g * (dTime += Time.delteTime);
        transform.position += (MoveSpeed + verticalSpeed) * Time.deltaTime;
        currentAngle.z = Mathf.Atan((MoveSpeed.y + verticalSpeed.y) / MoveSpeed.x) * Mathf.Rad2Deg;
        transform.eulerAngles = currentAngle;
    }

}

实现方法2:使用translate

    void Update () {
            verticalSpeed.y = g * (dTime += Time.delteTime);
            transform.Translate(MoveSpeed.x * Time.deltaTime, Space.World);
            transform.Translate(Vector3.up * verticalSpeed.y * Time.fixedDeltaTime, Space.World);
    }

实现方法三:代入y=nx²公式

    void Update(){
        float n = g * MoveSpeed * Math.Tan( Angle / 180 * Math.PI );
        transform.position.x = n;
        transform.position.y = 1 / ( 1 + Math.Tan( Angle / 180 * Math.PI )) * n * n;
    }

3.写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。
这个题目首先要明白各个星球的大小、轨道半径、转速比的比例和法平面是什么意思。
小行星等数目太多,考虑只做主要的卫星。
因为星球大小比例实在太夸张,如果如实做的话很多星球都会看不见,所以只做一个能显示大小的大概。轨道半径大小、转速比同理。
百度得到:
法平面:法平面是数学术语,是指过空间曲线的切点,且与切线垂直的平面,称为法平面。即垂直于虚拟法线的平面。例如,球体的中心为端点的射线,与球面所在的每一切点所在的切面即法平面(法面)。
所以不在一个法平面上指的是公转的轨道不能在一个平面上,但仍要满足以太阳系为核心
首先完成贴图工作
Unity学习笔记(二)--空间与运动&太阳系_第1张图片
脚本和上课写的地球公转基本一样

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

public class sunset : MonoBehaviour {

    public Transform sun;
    public Transform shuixing;
    public Transform jinxing;
    public Transform earth;
    public Transform huoxing;
    public Transform muxing;
    public Transform tuxing;
    public Transform tianwangxing;
    public Transform haiwangxing;
    public Transform moon;

    Vector3 []a = new Vector3[9];//通过法向量设置公转的法平面
    float []speed = {30,15,10,5,1,1,1,1};//公转速度
    float selfSpeed = 20;//自转速度
    float ry, rz;
    void Start () {
        int i = 0;
        for (i = 0; i < 9; i++) {
            y = Random.Range(1, 360); 
            z = Random.Range(1, 360); 
            a[i] = new Vector3(0, ry, rz); 
        }
    }

    // Update is called once per frame
    void Update () { 
        shuixing.RotateAround(sun.position, a[0], speed[0]*Time.deltaTime);
        shuixing.Rotate(Vector3.up *speed *Time.deltaTime);
        jinxing.RotateAround(sun.position, a[1], speed[1]*Time.deltaTime);
        jinxing.Rotate(Vector3.up *speed *Time.deltaTime);
        earth.RotateAround(sun.position, a[2], speed[2]*Time.deltaTime);
        earth.Rotate(Vector3.up *speed *Time.deltaTime);
        huoxing.RotateAround(sun.position, a[3], speed[3]*Time.deltaTime);
        huoxing.Rotate(Vector3.up *speed *Time.deltaTime);
        muxing.RotateAround(sun.position, a[4], speed[4]*Time.deltaTime);
        muxing.Rotate(Vector3.up *speed *Time.deltaTime);
        tuxing.RotateAround(sun.position, a[5], speed[5]*Time.deltaTime);
        tuxing.Rotate(Vector3.up *speed *Time.deltaTime);
        tianwangxing.RotateAround(sun.position, a[6], speed[6]*Time.deltaTime);
        tianwangxing.Rotate(Vector3.up *speed *Time.deltaTime);
        haiwangxing.RotateAround(sun.position, a[7], speed[7]*Time.deltaTime);
        haiwangxing.Rotate(Vector3.up *speed *Time.deltaTime);
        moon.RotateAround(earth.position, Vector3.right, 120 *Time.deltaTime);
    }
}

之后就完成啦~

你可能感兴趣的:(Unity学习笔记(二)--空间与运动&太阳系)