游戏内容
- 靶对象为 5 环,按环计分;
- 箭对象,射中后要插在靶上;
- 游戏仅一轮,无限 trials;添加一个风向和强度标志,提高难度;
思路
游戏设计
首先制作所需要的游戏对象。
靶对象的制作
创建一个Empty对象,命名为Target,然后创建五个Cylinder子对象,分别代表五个环,为了视觉效果好看些可以给环上不同的颜色,只需自己制作想要颜色的Material即可。五个环的属性如下:
注意最后这里我添加了第二个摄像机,用来近距离观察靶对象,必须设置clear flags属性为Depth Only,每次Render之前,只是清空深度缓冲区,但是并没有清空颜色缓冲区。这样第二个摄像机的画面就能够出现在主摄像机当中。
弓箭的制作
创建一个Empty对象为Arrow,其子对象使用一个Cylinder作为箭体,一个Cube作为箭头。箭头Box Collider的Is Trigger打勾,然后给Arrow添加rigidbody。
这里为箭头添加了碰撞监听事件,因为当弓箭击中靶目标的时候会插在靶上,并且根据击中的环得分,在箭头添加监听事件可以获取到碰撞到的是哪一个环,同时能够控制弓箭停在靶上。
其他游戏对象的制作可在源码中查看。
场记
在实现场记之前,先定义一下游戏所需要的接口。用户可以获取弓箭,移动弓箭的位置以及射出弓箭。场记管理的动作有增加或减少得分,改变风向及强度,同时也暴露出获取风向,风的强度大小的接口以供UI显示。
public interface IUserAction
{
void getArrow();
void moveArrow();
void shootArrow();
}
public interface ISceneController
{
void addScore(int point);
void showTips(int point);
void changeWind();
int getWindDirection();
int getWindStrength();
bool ifReadyToShoot();
}
下面是场记的实现:
public class SceneController : System.Object, IUserAction, ISceneController
{
private static SceneController instance;
private GameStateController gameStateController;
private ArrowController arrowController;
public static SceneController getInstance()
{
if (instance == null) instance = new SceneController();
return instance;
}
public void setGameStatueController(GameStateController gsc)
{
gameStateController = gsc;
}
public void setArrowController(ArrowController _arrowController)
{
arrowController = _arrowController;
}
public void addScore(int point)
{
gameStateC