3D游戏编程与设计第三次作业

作业内容

基本操作演练

1.下载 Fantasy Skybox FREE, 构建自己的游戏场景

首先进入unity,选择Assest Store,在搜索框中输入Fantasy Skybox FREE,选择第一个,进入界面后点击Download(unity的版本一定要大于它所需要的版本,否则无法下载),下载完成后点击Import将素材导入。
在这里插入图片描述
在这里插入图片描述
然后在unity界面的Project中新建一个Material,自定义名字为skybox。
在这里插入图片描述
之后在Inspector中修改Shader,改成Skybox->6 Sided
在这里插入图片描述
然后在Project中找到刚刚导入的文件夹,打开选择Textures,将自己喜欢的一组天空贴图按照对应的位置添加到刚刚创建的skybox中。
在这里插入图片描述
添加好之后的效果图如下:
在这里插入图片描述
然后选择Main Camera,在Inspector中点击Add Component->Rendering->Skybox
在这里插入图片描述
在这里插入图片描述
最后把刚刚自己制作好的skybox拖入到Main Camera新建的Skybox中即可。
在这里插入图片描述
点击运行查看效果图,之前制作的小游戏中,天空改变了:
在这里插入图片描述
还可以通过添加Terrain,通过创造地形,添加花草来构建自己想要的场景。

在这里插入图片描述
在这里插入图片描述

2.写一个简单的总结,总结游戏对象的使用

游戏对象目前所掌握的主要有:摄像机、3D物体、空对象、光源等。这些游戏对象每一个都包括了许多组件,使用不同的组件,可以使得游戏对象变得不一样。例如:修改Position来改变游戏对象在空间中的位置,修改Rotation可以改变游戏对象的姿态,修改Scale可以改变游戏对象的大小。更可以给游戏对象添加脚本,使游戏对象根据我们的所需来运动。我们还可以制作游戏对象的预制,这样可以重复利用,节省许多时间。

  • 摄像机:用来观察游戏世界,我们可以把负责View的脚本挂载到camara相机上来动态生成场景 。
  • 空对象:一个没有其他组件的GameObject对象,经常会将游戏控制单元脚本放在空对象上。
  • 3D物体:用于制作游戏角色,场景物件等等。
  • 光源:可以使游戏世界更加的逼真,例如:点光源的巧妙利用可以调节场景的明暗。

编程实践

牧师与魔鬼 动作分离版
  • 【2019新要求】:设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束。

动作类的模板代码没有改变,与老师给出的课件一致,这里就不做详细叙述了。

船的动作分离比较好实现,调用action里的moveBoat函数即可。
在这里插入图片描述
在这里插入图片描述
在上次作业代码中,人物角色的移动,我是瞬移的(通过压栈出栈来实现)这次本来想实现缓慢移向目标点,action中的moveRole函数与船的移动函数基本一致:
在这里插入图片描述
原本的函数修改为如下:
在这里插入图片描述
但是会出现以下的BUG:物体还没上到船就可以开始移动了,本来想判断一下动作队伍是否为空才执行船移动,但还是不行:
在这里插入图片描述

所以我自己再添加了两个动作类用于角色的上船和下船:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
相应的在Model文件做对应的修改:
在这里插入图片描述
在这里插入图片描述
详细代码参考文末给出的Github仓库链接

关于裁判类的实现

我主要是把原本在Model里的check函数写到裁判类当中,然后根据游戏目前情况,更改SSDirector的状态,具体代码如下:
Judgment.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using game;

public class Judgment : MonoBehaviour
{
    Stack<GameObject> leftPriests;
    Stack<GameObject> rightPriests;
    Stack<GameObject> leftDevils;
    Stack<GameObject> rightDevils;
    GameObject[] ship;
    SSDirector s1;
    public Judgment(Stack<GameObject>lp, Stack<GameObject>rp, Stack<GameObject>ld, Stack<GameObject>rd, GameObject[] s, SSDirector d)
    {
        this.leftPriests = lp;
        this.rightPriests = rp;
        this.leftDevils = ld;
        this.rightDevils = rd;
        this.ship = s;
        this.s1 = d;
    }

    public State Judge()
    {
        //全都达到右岸
        if (rightPriests.Count == 3 && rightDevils.Count == 3)
        {
            return State.Win;
        }
        //某一边恶魔多余牧师
        int numShipPriest = 0;
        int numLeftPriest = 0;
        int numRightPriest = 0;
        int numShipDevil = 0;
        int numLeftDevil = 0;
        int numRightDevil = 0;
        for (int i = 0; i < 2; i++)
        {
            if (ship[i] != null && ship[i].name == "Priest(Clone)")
            {
                numShipPriest++;
            }
            else if (ship[i] != null && ship[i].name == "Devil(Clone)")
            {
                numShipDevil++;
            }
        }
        if (s1.state == State.Left)
        {
            numLeftPriest = leftPriests.Count + numShipPriest;
            numRightPriest = rightPriests.Count;
            numLeftDevil = leftDevils.Count + numShipDevil;
            numRightDevil = rightDevils.Count;
        }
        else if (s1.state == State.Right)
        {
            numLeftPriest = leftPriests.Count;
            numRightPriest = rightPriests.Count + numShipPriest;
            numLeftDevil = leftDevils.Count;
            numRightDevil = rightDevils.Count + numShipDevil;
        }
        if ((numLeftPriest != 0 && numLeftPriest < numLeftDevil) || (numRightPriest != 0 && numRightPriest < numRightDevil))
        {
            return State.Lose;
        }
        return s1.state;
    }
}

本次作业所有代码:传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值