Skip to content

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.首先,查阅了太阳系相关的资料,获得太阳系大致结构如下(下图不包括围绕地球的月球) solarSystem

2.根据图中信息,并根据从属结构创建好游戏对象,把它们放置到大致的位置。游戏对象结构如下

Structure

将老师所给的贴图网站上的贴图下载下来,放到Resources文件夹中,一一拖动到游戏对象上,具体的实现效果如下 SolarSystem-Result1 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)

233

具体整个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就可以了,实现效果整体如下:

项目的地址如下: github@zhongwq/Unity3D-Learning/Homework2