//-------------------------------------------------------------------------------------
// ComponentPatternExample.cs
//-------------------------------------------------------------------------------------
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
namespace ComponentPatternExample
{
public class ComponentPatternExample : MonoBehaviour
{
RPGGame rpgGame = new RPGGame();
void Start()
{
rpgGame.Start();
}
void Update()
{
rpgGame.Update();
}
}
///
/// 游戏类
///
class RPGGame
{
public int velocity;
public int x = 0, y = 0;
//辅助类对象
public WorldX worldX = new WorldX();
public GraphicsX graphicsX = new GraphicsX();
//组件
private InputComponent inputComponent;
private PhysicsComponent physicsComponent;
private GraphicsComponent graphicsComponent;
//组件List
public List ComponentList = new List();
//组件List容量
int componentAmount = -1;
public void Start()
{
inputComponent = new PlayerInputComponent();
physicsComponent = new PlayerPhysicsComponent();
graphicsComponent = new PlayerGraphicsComponent();
ComponentList.Add(inputComponent);
ComponentList.Add(physicsComponent);
ComponentList.Add(graphicsComponent);
Debug.Log("Game Components Initialization Finish...");
Debug.Log("Please enter LeftArrow or RightArrow button to play...");
}
public void Update()
{
if (ComponentList == null)
{
return;
}
componentAmount = ComponentList.Count;
for (int i = 0; i < componentAmount; i++)
{
ComponentList[i].Update(this);
}
}
};
///
/// 输入组件
///
class PlayerInputComponent : InputComponent
{
public void Update(RPGGame game)
{
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
game.velocity -= WALK_ACCELERATION;
Debug.Log(" game velocity= " + game.velocity.ToString());
}
if (Input.GetKeyDown(KeyCode.RightArrow))
{
game.velocity += WALK_ACCELERATION;
Debug.Log(" game velocity= " + game.velocity.ToString());
}
}
private int WALK_ACCELERATION = 1;
}
///
/// 物理组件
///
class PlayerPhysicsComponent : PhysicsComponent
{
public void Update(RPGGame game)
{
game.x += game.velocity;
//Handle Physics...
}
}
///
/// 图形组件
///
class PlayerGraphicsComponent : GraphicsComponent
{
public void Update(RPGGame game)
{
//Handle Graphics...
if (game == null || game.graphicsX == null)
{
return;
}
Sprite sprite = spriteStand;
if (game.velocity < 0)
{
sprite = spriteWalkLeft;
}
else if (game.velocity > 0)
{
sprite = spriteWalkRight;
}
game.graphicsX.Draw(sprite, game.x, game.y);
}
private Sprite spriteStand;
private Sprite spriteWalkLeft;
private Sprite spriteWalkRight;
}
#region interfaces
interface BaseComponent
{
void Update(RPGGame game);
}
interface GraphicsComponent : BaseComponent
{
new void Update(RPGGame game);
}
interface PhysicsComponent : BaseComponent
{
new void Update(RPGGame game);
}
interface InputComponent : BaseComponent
{
new void Update(RPGGame game);
}
#endregion
#region 辅助类
class WorldX
{
}
class GraphicsX
{
public void Draw(Sprite sprite, float x, float y) { }
}
}
# endregion