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