Homework2
简答题
1.游戏对象运动的本质是什么?
游戏对象运动的本质就是游戏对象Transform的改变
- 请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)
a.直接改变Transform的position
public float Vx; public float Vy; private float nowVy; private Transform originTransform; // Use this for initialization void Start () { nowVy = Vy; originTransform = this.transform; } // Update is called once per frame void Update () { if (nowVy+Vy > 0.00001) { this.transform.position += Vector3.up * Time.deltaTime * nowVy; this.transform.position += Vector3.left * Time.deltaTime * Vx; nowVy -= 10 * Time.deltaTime; } else { } }
b.通过使用Vector3.MoveTowards
// Update is called once per frame void Update () { Debug.Log (nowVy + Vy); if (nowVy+Vy > 0.00001) { Vector3 target = this.transform.position + Vector3.up * Time.deltaTime * nowVy + Vector3.left * Time.deltaTime * Vx; this.transform.position = Vector3.MoveTowards (this.transform.position, target, Time.deltaTime); nowVy -= 10 * Time.deltaTime; } else { } }
c.通过使用transform.Translate
public float Vx; public float Vy; private float nowVy; private Vector3 speed; private Vector3 Gravity; // Use this for initialization void Start () { Gravity = Vector3.zero; speed = new Vector3 (Vx, Vy, 0); } // Update is called once per frame void Update () { if (2*Vy+Gravity.y > 0.00001) { Gravity.y -= 10 * Time.fixedDeltaTime; this.transform.Translate (speed*Time.fixedDeltaTime); this.transform.Translate (Gravity*Time.fixedDeltaTime); } else { } }
- 写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,且不在一个法平面上。
1.首先,查阅了太阳系相关的资料,获得太阳系大致结构如下(下图不包括围绕地球的月球)
2.根据图中信息,并根据从属结构创建好游戏对象,把它们放置到大致的位置。游戏对象结构如下
将老师所给的贴图网站上的贴图下载下来,放到Resources文件夹中,一一拖动到游戏对象上,具体的实现效果如下 3.下面就轮到写脚本了 因为行星的动作等大致相同,只有转速,法平面等地方有所区别,所以我直接把公转动作抽象成一个脚本,然后把会变化的部分设为public供给外部修改。 至于各个行星公转的法平面嘛,这方面不太了解,而且搜索页难以搜到准确的值,又鉴于每个行星的法平面需要不一样,所以直接佛系一波使用随机生成的法平面作为各个行星公转的平面🌚,如下,直接通过随机生成法线。
private Vector3 normalPlane; // Use this for initialization void Start () { normalPlane.Set (0, Random.Range (0, 10), Random.Range (0, 2)); }
为确保行星围绕Sun公转,法线应该设为(0,x,y),因为若行星围绕Sun的球心公转,球体位置与Sun球心行成的向量必须与法线向量垂直,而(x,0,0)*(0,x,y)==0,即(x,0,0)垂直于(0,x,y),所以法线应该设置为(0,x,y)
具体整个MonoBehavior实现如下:
public class Move : MonoBehaviour { public float speed; private Vector3 normalPlane; // Use this for initialization void Start () { normalPlane.Set (0, Random.Range (0, 10), Random.Range (0, 10)); } // Update is called once per frame void Update () { this.transform.RotateAround (this.transform.parent.position, normalPlane, speed); } }
其实代码十分简单,主要要知道如何Transform.RotateAround,知道这个函数就很好办了,写完脚本后只需把脚本一一拖动到GameObject上,设置好speed变量,整个程序就可以跑起来了。
为了方便看清楚不同行星的运动,验证结果,我利用了Unity3D中GameObject的路径渲染,直接给每个对象Add Component > Effects > Trail Renderer就可以了,实现效果整体如下: