文章目录
射箭游戏设计与实现
游戏要求:
游戏内容要求:
靶对象为 5 环,按环计分;
箭对象,射中后要插在靶上
增强要求:射中后,箭对象产生颤抖效果,到下一次射击 或 1秒以后
游戏仅一轮,无限 trials;
增强要求:添加一个风向和强度标志,提高难度
具体实现思路:
- 设计扁平圆柱体作为靶标,多个不同大小的圆柱体叠加形成不同的环,并利用颜色区分,由于叠加会影响正常显示,所以每个圆柱体的宽度(高)需要不一致,或者利用位置不同实现一个层级的效果,小的在前,大的在后就能显示出一个个环的效果。
- 由于对游戏轮次没有太大的要求,所以这里设置为游戏开始时拥有一定数量的箭,箭用完就算结束,显示得分,由用户决定是否再来一次(对于无限trails的规则不太清楚)。
- 风向则可是使用一个持续添加在箭上的力来实现。
具体实现代码
首先用到之前几个游戏的一些基类:Director、SSAction、SSActionManager、Singleton等,这几个类由于只是基类,真正的逻辑实现都在子类中,所以直接重用。
动作部分
先来说说游戏的动作部分,首先分析主要的运动对象:箭。。。没了。所以与之前打飞碟的游戏类似,只需要实现将箭飞出去的动作,通过物理引擎的实现之前也提到过,只需要在出去的瞬间给它添加一个力就可以了。
其次是风力的作用,与飞出去的瞬间力不同,风力是需要持续作用的力,所以需要在FixedUpdate里持续添加。
从以上可以看出,此动作类主要的关键属性有:运动方向、风力作用方向。ArrowAction
代码如下:
public class ArrowAction : SSAction{
public Vector3 force;
public Vector3 affect;
public static ArrowAction GetSSAction(Vector3 f, Vector3 wind) {
ArrowAction action = ScriptableObject.CreateInstance<ArrowAction>();
action.force = f;
action.affect = wind;
return action;
}
public override void FixedUpdate() {
this.gameObject.GetComponent<Rigidbody>().AddForce(affect, ForceMode.Acceleration);
if (this.transform.position.z > 3 || Mathf.Abs(this.transform.position.y) > 7 ||
Mathf.Abs(this.transform.position.x) > 10 || this.gameObject.tag == "ontarget") {
this.destroy = true;
if (this.gameObject.tag != "ontarget")
this.callBack.SSActionEvent(this);
}
}
public override void Update(