3D游戏编程与设计之空间与运动

3D游戏编程与设计

第三次作业 · 空间与运动


文章目录

    • 3D游戏编程与设计
      • 第三次作业 · 空间与运动
      • 一、简答题
      • 二、编程实践

一、简答题


1.游戏对象运动的本质是什么?

Answer:

本质就是使用矩阵变换(平移、旋转、缩放)来改变它的空间属性。

2.请用三种方法以上方法,实现物体的抛物线运动。

Answer:

能想到的三种方法是修改 position 、使用 vector3 、使用 Regidbody 的方法,下面我们一一进行阐述。

  • 直接修改 Transform.position

    public float speed_x = 2.0f;
    public float speed_y = 0;
    public int time = 0;
    
    void Update()
    {
        time +=(float)Time.deltaTime;
        float distance_x, distance_y;
        distance_x = (float)(speed_x * time);  
        distance_y = (float)(0.5 * 10 * time *time);
        this.transform.position += Vector3.right * distance_x;
        this.transform.position += Vector3.down * distance_y;
    
    }
    
  • 利用Vector3的方法

    //前面部分的参数设定同上面部分,我们只写一下Update的内容
    void Update()
    {
        time +=(float)Time.deltaTime;
        float distance_x, distance_y;
        distance_x = (float)(speed_x * time);  
        distance_y = (float)(0.5 * 10 * time *time);
      	this.transform.position += new Vector3(distance_x, distance_y, 0); 
    }
    
  • 利用 regidbody 的方法

    //我们给予刚体一个初始速度,直接利用Rigidbody就可以模拟抛物线的运动。
    public Rigidbody rb;
    public Vector3 firstspeed;
    
    void Start()
    {
        rb = GetComponent();
        rb.isKinematic = true;
    }
    
    void FixedUpdate()
    {
        firstspeed = new Vector3(0, 0, 0);
        rb.velocity = firstspeed;
    }
    

3.写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。

Answer:

这个题目其实是课堂上我们地球绕着太阳旋转的升级版。

说实话,太阳系运动的程序并不是很难写,但是配置的过程比较麻烦,其实主要牵扯到的就是两个函数。

  • Rotate : 完成星球自转的函数

    public void Rotate(Vector3 eulers);
    //`eulers` 就是我们想要旋转的角度
    
  • RotateAround :完成星球公转的函数

    public void RotateAround(Vector3 point, Vector3 axis, float angle);
    //其中point就是我们需要旋转的原点,这里就是太阳所在的坐标点,`axis`就是围绕轴,angle是啥大家都懂
    

在我的构建过程中,为了方便,直接将 sun 的位置坐标设定为(0, 0, 0),下面我们以地球为例,po一下代码。

GameObject.Find("Earth").transform.RotateAround(new Vector3(0, 0, 0), Vector3.up, 50 * Time.deltaTime);
GameObject.Find("Earth").transform.Rotate(Vector3.up * Time.deltaTime * 8000);

当然,因为要求在不同的法平面上,所以我们要将 Vector3.up 做出一定的修改。例如,改为 new Vector(0,1,0) 。其他的几个星球类似,太阳只设定自转即可,但是几个行星间的 axis 设定要不一样。

最后,我们得到的架构图如下:
3D游戏编程与设计之空间与运动_第1张图片
将我们的脚本拖进去运行一下,发现还是蛮漂亮的。为了使得运行的更加清晰,我们对每个行星增加了Trail Render ,增加它的时间后,会出现轨道的效果。最后的运行图如下面所示:
3D游戏编程与设计之空间与运动_第2张图片
除了太阳不太尽如人意……但是我找了半天真的没找到好看的太阳贴纸,只找到这个像鸭蛋一样颜色诡异的东西。

二、编程实践


  • 阅读以下脚本:

    Priests and Devils

    Priests and Devils is a puzzle game in which you will help the Priests and Devils to cross the river within the time limit. There are 3 priests and 3 devils at one side of the river. They all want to get to the other side of this river, but there is only one boat and this boat can only carry two persons each time. And there must be one person steering the boat from one side to the other side. In the flash game, you can click on them to move them and click the go button to move the boat to the other direction. If the priests are out numbered by the devils on either side of the river, they get killed and the game is over. You can try it in many > ways. Keep all priests alive! Good luck!

  • play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html )

  • 列出游戏中提及的事物(Objects)

    老师好像对 牧师过河 这个游戏情有独钟,想起大一上的时候,也是潘老师任教的《软件工程导论》课,又一次的作业题目也是让我们分析这个游戏,转眼间两年过去了,又做到这个题目,竟然有种浓浓的不真实感。

    游戏中提及的事物如下:

    • 三个牧师、三个魔鬼
    • 两个河岸
    • 一艘小船
  • 用表格列出玩家动作表(规则表),注意,动作越少越好

    玩家动作 动作条件
    船从岸的一侧开往另外一侧 船上必须有一个牧师或者魔鬼
    游戏结束 岸的任意一侧魔鬼数量大于牧师
    从左边上岸 船的左边有人(魔鬼或者牧师)
    从右边上岸 船的右边有人
  • 整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成 。整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的通讯耦合语句,不接受非 MVC 结构程序。

    所谓 MVC结构框架 ,就是 模型(model)-视图(view)-控制器(controller) ,用一种业务逻辑、数据、界面显示分离的方法组织代码,这样更改UI界面的时候就不需要更改其他方面了。

最后我们实现的游戏如下图:
3D游戏编程与设计之空间与运动_第3张图片
做完这个后……我觉得我回到了上 web2.0 的时代,开始慌了,不知道接下来还能不能活下来……

项目地址

你可能感兴趣的:(3D游戏)