游戏开发之Unity学习(二) ——空间与运动

  • 一、游戏对象运动的本质是什么?
  • 二、实现物体的抛物线运动。
  • 三、实现一个完整的太阳系(太阳、八大行星和月球)。

一、游戏对象运动的本质是什么?

游戏对象运动的本质就是不断的更新游戏对象的坐标,旋转游戏对象

void Update () {
    this.transform.position += Vector3.left * Time.deltaTime;
}

二、实现物体的抛物线运动。

实现物体的抛物线运动,首先得要实现直线运动,然后按照二次函数的概念,使得物体的运动轨迹转化为抛物线
方法一:首先使物体直线运动,然后直接给物体坐标赋值

void Update () {
    this.transform.position += Vector3.left  * Time.deltaTime;
    this.transform.position = new Vector3(this.transform.position.x, this.transform.position.x * this.transform.position.x, 0);
}

方法二:平移物体,每次改变平移方向(通过二次函数计算出来)

void Update () {
    this.transform.Translate(new Vector3(-1, (Time.deltaTime - 2 * this.transform.position.x)) * Time.deltaTime);
}

方法三:使用重力

void Start () {
     Rigidbody a = this.gameObject.AddComponent();
     a.useGravity = true;
     a.velocity = Vector3.left * 5;
}

方法四:使用Vector3.MoveTowards方法。

void Update () {
     transform.position = Vector3.MoveTowards(this.transform.position,
         this.transform.position + new Vector3(-1, Time.deltaTime - 2 * this.transform.position.x) * Time.deltaTime,
     1.0f*Time.deltaTime);
}

方法五:使用Vector3.Lerp方法。

void Update () {
     transform.position += Vector3.Lerp(this.transform.position,
         this.transform.position + new Vector3(-1, Time.deltaTime - 2 * this.transform.position.x) * Time.deltaTime, 1.0f);
}

三、实现一个完整的太阳系(太阳、八大行星和月球)。

实现一个太阳系,第一步是:
1. 创建9个(月球暂时不包括在内)球(Sphere),可以是同一级也可以将其他8个作为另一个的子对象。这里是同一级的,两种方法代码稍微有点不同。
2. 确定球的大小并将其沿x轴正方向排开,最大的那个是太阳,位于圆心,是固定不动的。注意留足空间(如下图)。
当然开始时是没有表面这些纹理的(忘记截图了,做完了又不想在改回去)。
游戏开发之Unity学习(二) ——空间与运动_第1张图片
第二步就开始写行星自转和公转代码了,这里一份代码就够了,将这份代码作为组件给每个对象(除了太阳)加上就可以了。为了实现不同速度(注意,这里RotateAround规定的是角速度),这里使用向心力(万有引力)与匀速圆周运动的公式推出的角速度

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

public class NewBehaviourScript1 : MonoBehaviour {
    private float r;
    // Use this for initialization
    void Start () {
        r = this.transform.position.x;
    }

    // Update is called once per frame
    void Update () {
        float speed = 100.0f * Mathf.Sqrt(1.0f / (r * r * r));
        this.transform.RotateAround(Vector3.zero,Vector3.up,speed *Time.deltaTime);
        this.transform.Rotate(axis, 10.0f* Time.deltaTime);
    }
}

第三步,实现初始位置随机和各星球不在同一法平面上并且旋转中心是太阳(随机位置后会出现旋转中心不是太阳的情况)。

public class NewBehaviourScript1 : MonoBehaviour {
    private float r;
    private Vector3 axis;
    // Use this for initialization
    void Start () {
        r = this.transform.position.x;
        float rx = Random.Range(-1.0f, 1.0f);
        float rz = Mathf.Sqrt(1 - rx * rx) * (Random.Range(0,2) == 1 ? -1 : 1);
        axis = new Vector3(rx == 0.0f ? 1.0f : -rz/rx, 0 ,rx == 0.0f ? 0.0f : 1.0f);
        this.transform.position = new Vector3(rx,0, rz) * r;
    }

    // Update is called once per frame
    void Update () {
        float speed = 100.0f * Mathf.Sqrt(1.0f / (r * r * r));
        this.transform.RotateAround(Vector3.zero, axis,speed *Time.deltaTime);
        this.transform.Rotate(axis, 10.0f* Time.deltaTime);
    }
}

github传送门

你可能感兴趣的:(游戏开发之Unity学习(二) ——空间与运动)