游戏对象运动的本质就是不断的更新游戏对象的坐标,旋转游戏对象
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轴正方向排开,最大的那个是太阳,位于圆心,是固定不动的。注意留足空间(如下图)。
当然开始时是没有表面这些纹理的(忘记截图了,做完了又不想在改回去)。
第二步就开始写行星自转和公转代码了,这里一份代码就够了,将这份代码作为组件给每个对象(除了太阳)加上就可以了。为了实现不同速度(注意,这里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传送门