1、简答并用程序验证
1.1游戏对象运动的本质是什么?
游戏对象运动的本质,其实是游戏对象跟随每一帧的变化,空间地变化。这里的空间变化包括了游戏对象的transform属性中的position跟rotation两个属性。一个是绝对或者相对位置的改变,一个是所处位置的角度的旋转变化。
1.2请用三种方法以上方法,实现物体的抛物线运动。(如,修改Transform属性,使用向量Vector3的方法…)
方法一:利用修改每一帧的position来实现抛物线运动,抛物线运动时,水平方向是匀速运动,竖直方向是加速度为9.8f的匀变速运动。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move1 : MonoBehaviour
{
private float ySpeed = 0;
private float gravity = 9.8f;
// 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 * 5;
this.transform.position += Vector3.down * Time.deltaTime * ySpeed;
ySpeed += gravity * Time.deltaTime;
}
}
方法二:声明一个Vector3变量,同时定义该变量的值,水平方向不变,竖直方向上均匀增加。
void Update()
{
Vector3 move= new Vector3(5* Time.deltaTime, -ySpeed * Time.deltaTime, 0);
this.transform.position += move;
ySpeed += gravity * Time.deltaTime;
}
方法三:与方法二类似,利用transform中的translate函数来进行改变position。
void Update()
{
Vector3 move= new Vector3(5* Time.deltaTime, -ySpeed * Time.deltaTime, 0);
this.transform.Translate(move);
ySpeed += gravity * Time.deltaTime;
}
1.3 写一个程序,实现一个完整的太阳系, 其他星球围绕太阳的转速必须不一样,且不在一个法平面上。
贴图下载链接
先分别制作十个游戏对象(太阳、八大行星、月球)并分别命名。并将下载好的贴图拖至Assets,在拖放到球体对象上。
添加脚本,为八大行星设置自传与公转,代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Sun : MonoBehaviour {
void Start () {
}
void Update () {
GameObject.Find("Earth").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 0), 30 * Time.deltaTime);
GameObject.Find("Earth").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Mercury").transform.RotateAround(Vector3.zero, new Vector3(1, 1, 0), 25 * Time.deltaTime);
GameObject.Find("Mercury").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Venus").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 1), 20 * Time.deltaTime);
GameObject.Find("Venus").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Mars").transform.RotateAround(Vector3.zero, new Vector3(2, 1, 0), 45 * Time.deltaTime);
GameObject.Find("Mars").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Jupiter").transform.RotateAround(Vector3.zero, new Vector3(1, 2, 0), 35 * Time.deltaTime);
GameObject.Find("Jupiter").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Saturn").transform.RotateAround(Vector3.zero, new Vector3(0, 1, 2), 40 * Time.deltaTime);
GameObject.Find("Saturn").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Uranus").transform.RotateAround(Vector3.zero, new Vector3(0, 2, 1), 45 * Time.deltaTime);
GameObject.Find("Uranus").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
GameObject.Find("Neptune").transform.RotateAround(Vector3.zero, new Vector3(1, 1, 1), 50 * Time.deltaTime);
GameObject.Find("Neptune").transform.Rotate(Vector3.up * Time.deltaTime * 10000);
}
}
由于地球存在自转,其会影响到月球围绕着地球转的问题,所以我们需要新建一个空对象,将该空对象的位置设置成地球的位置,同时公转速度与地球同步但是不自转,再将月球设置成该空对象的子对象,即可实现地月的旋转,代码如下(空对象的公转同地球在此省略):
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Moon : MonoBehaviour {
void Start () {
}
void Update () {
Vector3 position = this.transform.parent.position;
this.transform.RotateAround(position, Vector3.up, 360 * Time.deltaTime);
}
}
为游戏对象添加Trail Renderer组件,运行效果如下:编程实践
程序需要满足的要求:
- play the game ( http://www.flash-game.net/game/2535/priests-and-devils.html )
- 列出游戏中提及的事物(Objects)
- 用表格列出玩家动作表(规则表),注意,动作越少越好
- 请将游戏中对象做成预制
- 在 GenGameObjects 中创建 长方形、正方形、球 及其色彩代表游戏中的对象。
- 使用 C# 集合类型 有效组织对象
- 整个游戏仅 主摄像机 和 一个 Empty 对象, 其他对象必须代码动态生成!!! 。 整个游戏不许出现 Find 游戏对象,SendMessage 这类突破程序结构的 通讯耦合 语句。 违背本条准则,不给分
- 请使用课件架构图编程,不接受非 MVC 结构程序
- 注意细节,例如:船未靠岸,牧师与魔鬼上下船运动中,均不能接受用户事件!
- 游戏中的对象有:牧师、魔鬼、小船、开始岸、结束岸
- 用表格列出玩家动作表(规则表)
操作 | 条件 |
---|---|
牧师、魔鬼上船 | 船靠岸且船上不得多于两人 |
牧师、魔鬼下船 | 船靠岸 |
船过河 | 船上不得少于1个人 |
-
将游戏中对象做成预制
-
MVC结构
-
运行效果
- 具体代码及演示视频见项目地址