1、简答并用程序验证
· 游戏运动对象的本质是什么
游戏对象的本质是通过矩阵变换在每一帧更改物体的控件属性,如长宽、缩放等
· 请用三种方法以上方法,实现物体的抛体运动。(如修改Transform属性,使用向量Vector3的方法)
方法一:修改Transform属性
在这里,我们将抛体运动拆分为两个方向的运动。在right方向上我们认为物体坐初速度为1的匀速直线运动。在up方向上我们认为物体做初速度为5加速度为1的竖直上抛运动。由于每个deltaTime的值都很小,所以我们在计算竖直方向上的每一小段都看作匀速运动。
public class ParabolaBehaviour : MonoBehaviour
{
public float speed = 5;
public float a = 1;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
this.transform.position += Vector3.right * Time.deltaTime;
this.transform.position += Vector3.up * Time.deltaTime * speed;
speed -= Time.deltaTime * a;
}
}
方法二:使用向量Vector3的方法
原理同方法1。代码稍作调整。
public class ParaBolaBehaviour2 : MonoBehaviour
{
public float speed = 5;
public float a = 1;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 move = new Vector3(Time.deltaTime * 1, Time.deltaTime * speed, 0);
this.transform.position += move;
speed -= Time.deltaTime * a;
}
}
方法三:用translate函数来执行Vector3,原理与上两种方法相同,代码稍作调整。
public class ParabolaBehaviour3 : MonoBehaviour
{
public float speed = 5;
public float a = 1;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Vector3 move = new Vector3(Time.deltaTime * 1, Time.deltaTime * speed, 0);
this.transform.Translate(move);
speed -= Time.deltaTime * a;
}
}
· 写一个程序,实现一个完整的太阳系,其他星球围绕太阳的转速必须不一样,且不在一个法平面上。
首先,我们先上网查询资料,查询八大行星的英文、大小、距离太阳的距离
1,水星英文名:Mercury
2,金星英文名:Venus
3,地球英文名:Earth
4,火星英文名:Mars
5,木星英文名:Jupiter
6,土星英文名:Saturn
7,天王星英文名: Uranus
8,海王星英文名: Neptune
按照离太阳的距离从近到远,它们依次为水星、金星、地球、火星、木星、土星、天王星、海王星。
八大行星体积由大到小分别是,木星、土星、天王星、海王星、地球、金星、火星、水星。
在这里我们就不精确设置行星半径和轨道半径的比例了,能区分大小关系即可。
首先我们设计游戏对象。
接着我们编写脚本。只需要在一个sun脚本中中编写即可,需要设置好变量对应的是哪个对象的transform。同时在rotatearound函数中可以修改轴向让这些星星轨迹不在一个法平面上。代码如下:
public class SolarSystemBehaviour : MonoBehaviour
{
public Transform sun;
public Transform Mercury;
public Transform Venus;
public Transform Earth;
public Transform Mars;
public Transform Jupiter;
public Transform Saturn;
public Transform Uranus;
public Transform Neptune;
public Transform Moon;
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
Mercury.RotateAround(sun.position, new Vector3(0, 1, 1), 80 * Time.deltaTime);
Mercury.Rotate(new Vector3(0, 1, 1) * 5 * Time.deltaTime);
Venus.RotateAround(sun.position, new Vector3(0, 1, 2), 70 * Time.deltaTime);
Venus.Rotate(new Vector3(0, 1, 2) * 10 * Time.deltaTime);
Earth.RotateAround(sun.position, new Vector3(0, 5, 1), 60 * Time.deltaTime);
Earth.Rotate(new Vector3(0, 5, 1) * 15 * Time.deltaTime);
Mars.RotateAround(sun.position, new Vector3(0, 3, 1), 50 * Time.deltaTime);
Mars.Rotate(new Vector3(0, 3, 1) * 20 * Time.deltaTime);
Jupiter.RotateAround(sun.position, new Vector3(0, 10, 1), 40 * Time.deltaTime);
Jupiter.Rotate(new Vector3(0, 10, 1) * 25 * Time.deltaTime);
Saturn.RotateAround(sun.position, new Vector3(0, 4, 1), 30 * Time.deltaTime);
Saturn.Rotate(new Vector3(0, 4, 1) * 30 * Time.deltaTime);
Uranus.RotateAround(sun.position, new Vector3(0, 2, 1), 20 * Time.deltaTime);
Uranus.Rotate(new Vector3(0, 2, 1) * 35 * Time.deltaTime);
Neptune.RotateAround(sun.position, new Vector3(0, 8, 1), 10 * Time.deltaTime);
Neptune.Rotate(new Vector3(0, 8, 1) * 40 * Time.deltaTime);
Moon.transform.RotateAround(Earth.position, Vector3.up, 200 * Time.deltaTime);
}
}
效果图如下:
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
· 列出游戏中提及的事物(Objects)
· 用表格列出玩家动作表(规则表),注意,动作越少越好
· 请将游戏中对象做成预制
· 在场景控制器 LoadResources 方法中加载并初始化 长方形、正方形、球 及其色彩代表游戏中的对象。
· 使用 C# 集合类型 有效组织对象
· 整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!! 整个游戏不许出现 Find 游戏对象, SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分
· 请使用课件架构图编程,不接受非 MVC 结构程序
· 注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!
1.玩家动作表
玩家动作 | 条件 | 结果 |
---|---|---|
启动游戏 | 初始界面 | |
上船 | 船在点击处的河岸边 | 牧师或恶魔上船 |
开船 | 船上至少一人至多两人 | 船开到对岸 |
结束 | 任意一边牧师数大于恶魔数/所有人都到达对岸 | 胜利/失败 |
2.制作预制包括牧师恶魔等五个对象
3.在场景控制器 LoadResources 方法中加载并初始化 长方形、正方形、球 及其色彩代表游戏中的对象。
因为在代码文件中每个预制对象的初始化都是在各自的model类中完成,所以实际上LoadResources中并没有完成加载。在这里贴出LoadResources的代码
public void LoadResources(){
Debug.Log("DD");
GameObject water = Instantiate(Resources.Load("Prefabs/Water", typeof(GameObject)), new Vector3(0,-1,0), Quaternion.identity) as GameObject;
water.name = "water";
start_land = new LandModel("start");
end_land = new LandModel("end");
boat = new BoatModel();
role = new RoleModel[6];
for (int i = 0; i < 3; i++){
RoleModel r = new RoleModel("priest");
r.SetName("priest" + i);
r.SetPosition(start_land.GetEmptyPosition());
r.GoLand(start_land);
start_land.AddRole(r);
role[i] = r;
}
for (int i = 3; i < 6; i++){
RoleModel r = new RoleModel("devil");
r.SetName("devil" + i);
r.SetPosition(start_land.GetEmptyPosition());
r.GoLand(start_land);
start_land.AddRole(r);
role[i] = r;
}
}
4.MVC架构
脚本文件如下,运行时只需要将Controller放入空的Gameobject即可。
5.Play the game
成功和失败的截图如下。
其余代码链接:https://github.com/AuKeeWa/Assets-homework3.git