作业内容
基本操作演练
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物体:用于制作游戏角色,场景物件等等。
- 光源:可以使游戏世界更加的逼真,例如:点光源的巧妙利用可以调节场景的明暗。
编程实践
牧师与魔鬼 动作分离版
动作类的模板代码没有改变,与老师给出的课件一致,这里就不做详细叙述了。
船的动作分离比较好实现,调用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;
}
}