1、基本操作演练【建议做】
下载 Fantasy Skybox FREE, 构建自己的游戏场景
写一个简单的总结,总结游戏对象的使用
由于下载Fantasy Skybox FREE需要更新到unity2017.3.1,我这里就不做具体操作了。
一般步骤如下:
1建立天空盒
2把所需要的贴图放入Assert中
3创建Material,并将Shader的值改为Skybox/6 Sided
4把天空盒每个面的贴图都贴上去
5创建一个Terrain,然后可在Inspector面板上对地形进行修改。
6将地表的大概形状弄好后,就是把草地,树木等植被弄上去就好
7下载树木和草地的资源并把这些资源加到地面
8把天空盒安置在摄像头上。
2、编程实践
牧师与魔鬼 动作分离版
【2019新要求】:设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束
动作管理器的设计
为了用一组简单的动作组合成复杂的动作,我们采用 cocos2d 的方案,建立与 CCAtion 类似的类。设计思路如下:
设计一个抽象类作为游戏动作的基类
设计一个动作管理器类管理一组游戏动作的实现类
通过回调,实现动作完成时的通知
这样的目的是让程序可以方便的定义动作并实现动作的自由组合,使得:
1.程序更能适应需求变化
2.对象更容易被复用
3.程序更易于维护
核心代码与设计解读:
裁判类Referee
using UnityEngine;
using System.Collections;
public interface Referee{
void setLose();
void setWin();
void check(int a,int b,int a_,int b_);
}
裁判类有setLose()、setWin()和check()三个函数
动作基类(SSAction)
using UnityEngine;
using System.Collections;
public class SSAction : ScriptableObject {
public bool enable = true;
public bool destory = false;
public GameObject gameobject { get; set; }
public Transform transform { get; set; }
public ISSActionCallback callback { get; set; }
protected SSAction() { }
// Use this for initialization
void Start () {
throw new System.NotImplementedException();
}
// Update is called once per frame
void Update () {
throw new System.NotImplementedException();
}
}
设计要点:
1.ScriptableObject 是不需要绑定 GameObject 对象的可编程基类。这些对象受 Unity 引擎场景管理
2.protected 防止用户自己 new 对象
3.使用 virtual 申明虚方法,通过重写实现多态。这样继承者就明确使用 Start 和 Update 编程游戏对象行为
4.利用接口(ISSACtionCallback)实现消息通知,避免与动作管理者直接依赖
简单动作实现
public Vector3 target;
public float speed;
private SSMoveToAction() { }
public static SSMoveToAction GetSSAction(Vector3 target, float speed)
{
SSMoveToAction action = ScriptableObject.CreateInstance<SSMoveToAction>();
action.target = target;
action.speed = speed;
return action;
}
public void Update()
{
this.transform.position = Vector3.MoveTowards(this.transform.position, target, speed * Time.deltaTime);
if (this.transform.position == target)
{
this.destory= true;
this.callback.SSActionEvent(this);
}
}
public void Start()
{
}
设计要点:
1.让 Unity 创在这里插入代码片
建动作类,确保内存正确回收。别指望手机开发者是 c 语言高手。
2.多态。C++ 语言必申明重写,Java则默认重写
3.似曾相识的运动代码。动作完成,则期望管理程序自动回收运行对象,并发出事件通知管理者。
顺序动作组合类实现
设计要点:
1.让动作组合继承抽象动作,能够被进一步组合;实现回调接受,能接收被组合动作的事件
2创建一个动作顺序执行序列,-1 表示无限循环,start 开始动作。
Update方法执行执行当前动作
3。SSActionEvent 收到当前动作执行完成,推下一个动作,如果完成一次循环,减次数。如完成,通知该动作的管理者
4.Start 执行动作前,为每个动作注入当前动作游戏对象,并将自己作为动作事件的接收者
5.OnDestory 如果自己被注销,应该释放自己管理的动作。
这是标准的组合设计模式。被组合的对象和组合对象属于同一种类型。通过组合模式,我们能实现几乎满足所有越位需要、非常复杂的动作管理。
动作事件接口定义
using UnityEngine;
using System.Collections;
public enum SSActionEventType : int { Started, Competeted }
public interface ISSActionCallback
{
void SSActionEvent(SSAction source, SSActionEventType events = SSActionEventType.Competeted,
int intParam = 0, string strParam = null, Object objectParam = null);
}
动作管理基类 – SSActionManager
这是动作对象管理器的基类,实现了所有动作的基本管理
成品图如下:
按钮分为组合按钮和单步按钮,d+p等按钮为组合动作按钮