您的位置:首页 > 移动开发 > Unity3D

Unity3D学习(3)——物体的运动&简易太阳系

2017-04-16 11:11 429 查看
这一节我们将探究物体的运动,并且尝试制作一个简易的太阳系。

在Unity中,实现运动的常见手段有如下几种:

修改Transform属性,比如Translate, Rotate, RotateAround, LookAt等

使用向量Vector3的方法,进行规范化等操作,或进行向量之间的运算

修改四元素和欧拉角,二者都是等价3D空间旋转矩阵表示,可进行计算、旋转等操作

使用character controller类的move函数,数值以绝对运动形式表示

下面对上述方法的实现进行举例(均为使物体向右移动):

修改向量:

this.transform.position += Vector3.right * Time.deltaTime


transform变换:

transform.Rotate(Vctor3.right * speed * Time.deltaTime)


四元素:

transform.rotation = Quaternion.AngleAxis(degrees, transform.right) * transform.rotation


move函数:

CharacterController controller = GetComponent<CharacterController>();
Vector moveDirection = Vector3.right;
Controller.Move(moveDirection * Time.deltaTime);


结合了以上知识,我们可以设计一个简易的太阳系。

首先创建一个太阳和八大行星(九个球体对象),沿X轴排列开来。为每个星球添加材质,这里为了简化,只是简单地为每个星球添加了颜色的材质。另外,为了更容易辨认太阳,将其放大2倍。初始的排列如下:



编写旋转脚本,挂载在八大行星对象上:

Rotate.cs

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

public class Rotate : MonoBehaviour {
public Transform origin;
public float speed = 20;
float ry, rz;

// 要使不同行星尽量不在同一法平面上,只需确保每个行星的Y、Z轴坐标之比不相等即可
// 故选用随机数模拟每个行星的Y、Z轴坐标
void Start() {
ry = Random.Range(1, 360);
rz = Random.Range(1, 360);
}

// 描述行星绕太阳旋转,此处使用了RotateAround函数
void Update() {
Vector3 axis = new Vector(0, ry, rz);
this.transform.RotateAround(origin.position, axis, speed*Time.deltaTime);
}
}


在inspector界面修改Rotate脚本的属性,修改遵循以下原则:所有行星都围绕太阳旋转,且不同星球的公转速度不同,离太阳越远的行星速度越慢。以木星的属性为例,界面如下:



为了方便查看八大行星公转轨迹,所有行星添加trail renderer组件,并修改轨迹宽度。以木星的属性为例,界面如下:



运行,模拟效果如图(由于视频大小限制,只截取了中间部分):

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: