2020-10-05

    科技2022-08-10  98

    简答题

    游戏对象运动的本质是什么?请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)方法一方法二方法三 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。编程实践思考题

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

    游戏运动本质就是使用矩阵变换(平移、旋转、缩放)改变游戏对象的空间属性。这里的空间变化包括了游戏对象的transform属性中的position跟rotation两个属性。一个是绝对或者相对位置的改变,一个是所处位置的角度的旋转变化。

    请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)

    方法一

    可以通过transform属性position,水平方向保持初速度匀速,竖直方向以初速为零按重力加速度变化,两个方向运动矢量相加。

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class test : MonoBehaviour { private float speed = 0.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.position += Vector3.left * 3.0f ; transform.position += Vector3.down * speed * Time.deltaTime; speed += 9.8f * Time.deltaTime; } }

    方法二

    通过创建一个Vector3变量,竖直方向上是一个均匀增加的数值,水平方向是一个保持不变的数值,然后将游戏对象原本的position属性与该向量相加即可实现抛物线运动

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class test : MonoBehaviour { private float speed = 0.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.position += new Vector3(Time.deltaTime * 3.0f, Time.deltaTime * speed, 0); speed -= Time.deltaTime * 9.8f; } }

    方法三

    通过translate函数传入一个vector3向量改变position

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class test : MonoBehaviour { private float speed = 0.0f; // Use this for initialization void Start () { } // Update is called once per frame void Update () { transform.Translate(new Vector3(Time.deltaTime * 3.0f, Time.deltaTime * speed, 0)); speed -= Time.deltaTime * 9.8f; } }

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

    结构板块分析: 1.其他星球围绕太阳旋转:RotateAround函数 2.转速不一样:变量speed不一样 3.不在一个法平面:法平面是指过空间曲线的切点,且与切线垂直的平面。要求不在一个法平面内,则在保证所有行星以及太阳在一条轴上时,另外两条轴的比例不相同即可。

    通过查询到的数据设置八大行星以及太阳月亮的位置关系和大小

    根据相对大小以及位置关系构造:

    首先运用RotateAround和Rotate函数设置行星公转和自转,将八大行星的运动写进同个脚本里面,挂在Sun对象上即可,接着实现预制动态生成。 具体代码详见github

    编程实践

    程序需要满足的要求:

    play the game列出游戏中提及的事物(Objects)用表格列出玩家动作表(规则表),注意,动作越少越好 请将游戏中对象做成预制在场景控制器 LoadResources 方法中加载并初始化 长方形、正方形、球 及其色彩代表游戏中的对象。使用 C# 集合类型 有效组织对象整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!! 整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分请使用课件架构图编程,不接受非 MVC 结构程序注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件! 游戏中提及的对象:Priests,Devils,boat,one side,the other side玩家规则表: 事件条件结果开船船上有一个人开船,一次船上只能有两个人将一个人载到对岸牧师上船船在岸边,船上有空位,岸边有牧师这岸少了一个牧师,对岸多了一个牧师恶魔上船船在岸边,船上有空位,岸边有恶魔这岸少了一个恶魔,对岸多了一个牧师

    题目中采用mvc结构,仅 主摄像机 和 一个 Empty 对象 首先是完成相关的预制,一共是四个,分别是代表魔鬼的球体,代表牧师的正方体,代表小船的长方体,代表河岸的大型长方体。 之后根据mvc结构,分别创建三个脚本Model,VIew,Controller。View脚本挂在空对象下,其余两个脚本都挂在摄像头下。 Controller脚本需要构造game的命名空间,因为根据MVC模式的特点,我们需要把提供给用户界面的接口API暴露出来。因为接口可能不唯一,为了方便调用,我们可以直接用一个namespace进行管理,这样只需要使用这个命名空间我们就能使用下面所有的接口了。通过UserAction接口定义行为,上船下船等等,然后SSDirector(导演)应该使用单例模式保证导演实例有且仅有一个,其负责在场景初始化时控制对应的场景。 Model该脚本中定义了游戏对象的位置和完善游戏动作的函数,同时负责加载预制的游戏对象。实现设置位置,加载游戏对象,上船下船,判断船上是否有空位,游戏对象从岸上到船上的变化,重置游戏。 VIew是应用程序中处理数据显示的部分,该脚本中设置了游戏的UI,分为游戏的按钮类和点击物体类。 具体代码详见github 运行截图:

    思考题

    使用向量与变换,实现并扩展 Tranform 提供的方法,如 Rotate、RotateAround 等 要实现Rotate函数,我们可以利用Quaternion.AngleAxis函数,这个函数是绕axis轴旋转angle,创建一个旋转。所以我们根据旋转角angle以及旋转轴axis,获得这个旋转。然后我们再改变t的位置和旋转即可:

    void Rotate(Transform t, Vector3 axis, float angle) { var rotate = Quaternion.AngleAxis(angle, axis); t.position = rotate * t.position; t.rotation *= rotate; }

    同样的,要实现RotateAround函数,我们也需要利用Quaternion.AngleAxis函数先获得这个旋转。因为这时候是围绕中心旋转的,所以我们要计算一下位移,也就是求this.positon和center的位移。将其进行旋转之后再加上中心的位移即可。

    void RotateAround(Transform t, Vector3 center, Vector3 axis, float angle) { var rotate = Quaternion.AngleAxis(angle, axis); var direction = position - center; direction *= rotate; t.position = center + direction; t.rotation *= rotate ; }
    Processed: 0.014, SQL: 8