3D游戏编程blog3

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
按照离太阳的距离从近到远,它们依次为水星、金星、地球、火星、木星、土星、天王星、海王星。
八大行星体积由大到小分别是,木星、土星、天王星、海王星、地球、金星、火星、水星。
在这里我们就不精确设置行星半径和轨道半径的比例了,能区分大小关系即可。
首先我们设计游戏对象。


图片1.png

接着我们编写脚本。只需要在一个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.png

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.png

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容