当前位置:   article > 正文

Unity3D 与游戏世界交互 | 打飞碟_unity游戏交互

unity游戏交互

1、编写一个简单的鼠标打飞碟(Hit UFO)游戏

  • 游戏规则:
    1. 游戏至少有三个 round(其实到round3就很容易死了。)
    2. 每个round内难度一样,但是不同round难度递增。
    3. 每个round中飞碟出现的位置是随机的。
    4. 鼠标点中得分,紫飞碟1分,绿飞碟3分,红飞碟5分。
    5. 每次游戏有6条命,少点一个掉一条命,没有命游戏结束。
  • 游戏的要求:
    • 使用带缓存的工厂模式管理不同飞碟的生产与回收,该工厂必须是场景单实例的!具体实现见参考资源 Singleton 模板类
    • 近可能使用前面 MVC 结构实现人机交互与游戏模型分离
  • 扩展:
    • 用自定义组件定义几种飞碟,编辑并赋予飞碟一些属性,做成预制

UML类图:

因为我参考了前辈的代码,UML类图几乎一样,所以直接借用了(末尾有前辈的链接)。

在这里插入图片描述

其中SSAction、SequenceAction、ActionCallBack、ActionManager与上次的牧师与魔鬼几乎相同,所以这次不多加说明,主要关注新增的类。

UFOFlyAction

这个类是SSAction的实现,写了UFO做的动作,包括飞的速度、射出位置、射出角度的方法,以及动作结束的条件。当动作结束,飞碟会等待回收。

public static UFOFlyAction GetSSAction(Vector3 direction, float angle, float power){
        //初始化物体将要运动的初速度向量
    UFOFlyAction action = CreateInstance<UFOFlyAction>();
    if (direction.x == -1) {
    		action.start_vector = Quaternion.Euler(new Vector3(0, 0, -angle)) * Vector3.left * power;
    }else{
        action.start_vector = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right * power;
    }
    return action;
}
public override void Update(){
        //计算物体的向下的速度,v=at
		time += Time.fixedDeltaTime;
    gravity_vector.y = gravity * time;

        //位移模拟
    transform.position += (start_vector + gravity_vector) * Time.fixedDeltaTime;
    current_angle.z = Mathf.Atan((start_vector.y + gravity_vector.y) / start_vector.x) * Mathf.Rad2Deg;
    transform.eulerAngles = current_angle;

        //如果物体y坐标小于-5,动作就做完了
    if (this.transform.position.y < -5){
        this.destroy = true;
        this.whoToNotify.SSActionEvent(this);      
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
FlyAtionManager

当场景控制器需要飞碟飞出来时,它会调用上面动作管理类的方法,来控制飞碟飞行。它们的关系可以理解为,飞碟能做的动作在动作管理类,但是飞碟要做什么是由这个控制器控制的,场景控制器决定飞碟在什么情况下动作。

public UFOFlyAction fly;                            //飞碟飞行的动作
public FirstController scene_controller; 					//场景管理类

protected void Start() {
    scene_controller = (FirstController)SSDirector.GetInstance().CurrentScen
  • 1
  • 2
  • 3
  • 4
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号