基本操作演练
- 下载 Fantasy Skybox FREE, 构建自己的游戏场景
- 写一个简单的总结,总结游戏对象的使用
下载Fantasy Skybox FREE 构建场景
(1)在Asset Store搜索Fantasy Skybox FREE并下载。
(2)将Fantasy Skybox FREE导入项目,查看相关资源。主要是Asset\Fantasy Skybox FREE\Demo\Prefabs
文件夹中的预制和Asset\Fantasy Skybox FREE\Demo\Terrain
文件夹下已经做好的场地场景。
(3)利用已有的预制和场景构建自己的游戏场景,主要需要完成的也只是将已有的游戏对象拖入Scene。
总结游戏对象的使用
作为程序员,我们大多对美工没有成熟的想法和技术,所以由我们自己完成对游戏场景的塑造确实有点强人所难,但是美好的场景对于一款游戏来说却又是必须的,因此,我们有必要借助别人已经做好的模型,用这些已经成熟的组件完成对场景的构建,具体的行为和交互由我们自己编写的程序完成,通过简单的拖动或创建完成场景在生产过程是简化生产流程和生产成本的一个有效途径。
编程实践
- 牧师与魔鬼 动作分离版
- 设计一个裁判类,当游戏达到结束条件时,通知场景控制器游戏结束
动作分离
(1)首先查看UML图,SSAction类
是动作类,负责所有动作的具体信息以及实施;SSActionManager类
是动作管理类,负责控制动作的执行;XXSceneController类
是场景管理类,当有游戏对象需要移动时,需要将该信号传递给CCActionManager类
;CCActionManager类
派生自SSActionManager类
,接收来自场记的信号,并完成对动作的调配和执行;CCSequenceAction类
和CCMoveToAction类
都派生自SSAction类,前者代表组合动作,后者代表移动到某一目的地的动作;SSActionEvent
是一个接口,交由SSAction类实现。
(2)其次需要对现有类做一些补充,使得功能更为完善和安全,确保系统的健壮性。添加ISSActionCallback类
,用于标识动作是否已经完成,将完成的消息返回给动作管理类,以便动作管理类执行下一个动作。所以该类将会成为SSAction类
的一个属性,作为callback被调用,告诉SSActionManager类
,动作完成。根本原理是,ISSActionCallback类
包含唯一的方法,用于对一个已结束的动作做处理,所以动作管理类都必须对该类继承;而动作类又必须有该类的属性,以便于在动作结束后调用。
(3)查看师姐的代码,发现一个小缺陷,在动作管理类中,因为没有对其管理的动作的callback的函数定义,所以在Update函数
中使用enable属性
来判断动作是否正在进行中是不合理的,毕竟所有动作的enable属性
都被赋值为true
并且不会被修改。
遇到的一些问题:
1.列表List<>
在声明后必须用new List,<>()
初始化,否则就没有创建实例,无法使用,C#语言特性,类似Java。
2.对于Start()
、Update()
这样的方法。当他们存在于父类中时,子类中即便不需要,也必须实现,否则,他们会在运行过程中自动调用父类的版本,可能引起错误。
3.派生自MonoBehaviour类
的类必须通过AddComponent方法
才能加入到场景中,或者说加入到游戏对象上。
ActionManager.cs 代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Director;
namespace ActionManager
{
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);
}
public class SSAction : ScriptableObject /* 动作 */
{
public bool enable = true; /* 是否正在进行此动作 */
public bool destroy = false; /* 是否需要被销毁 */
public GameObject gameobject; /* 动作对象 */
public Transform transform; /* 动作对象的transform */
public ISSActionCallback callback; /* 回调函数 */
protected SSAction() {
} /* 保证SSAction不会被new */
public virtual void Start() /* 子类可以使用这两个函数 */
{
throw new System.NotImplementedException();
}
public virtual void Update()
{
throw new System.NotImplementedException();
}
}
public class CCSequenceAction : SSAction, ISSActionCallback/* 组合动作类 */
{
List<SSAction> sequence; /* 动作列表 */
int repeat;