Player实例化

修改Player的Prefab的Y坐标,这里改为-2。

修改SceneRoot

1
2
3
4
5
6
7
8
public class SceneRoot : MonoBehaviour
{
public void Init()
{
//...
var player = LoadMgr.Instance.LoadPrefabAndInstantiate(Pathes.PREFAB_PLAYER);
player.AddComponent<PlayerView>();
}

PlayerView

在Logic——View文件夹下新建PlayerView

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
27
28
29
30
31
32
33
34
35
36
37
using UnityEngine;

public class PlayerView : PlaneView
{
private readonly float _startY = -2.0f;
public override void Init()
{
InitPos();
InitSprite();
InitComponent();
}
private void InitComponent()
{
var reader = ReaderMgr.Instance.GetReader(Pathes.INIT_PLANE_CONFIG);
reader["planeSpeed"].Get<float>(speed =>
{
var moveCo = gameObject.AddComponent<MoveComponent>();
moveCo.Init(speed);
gameObject.AddComponent<PlayerController>();
gameObject.AddComponent<CameraMove>();
});
}
private void InitPos()
{
var pos = transform.position;
pos.y = _startY;
transform.position = pos;
}
private void InitSprite()
{
var spriteRenderer = GetComponent<SpriteRenderer>();
int id = GameStateModel.Instance.SelectedPlaneId;
int level = GameStateModel.Instance.PlaneLevel;
var sprite = PlaneSpritesModel.Instance[id, level];
spriteRenderer.sprite = sprite;
}
}

这里把Player初始化的Y坐标直接写在变量里了,正常情况下应该写在配置文件中。

这里的MoveComponent和新加的配置在下一节介绍。只有添加了移动组件才能使用PlayerController控制飞机,所以这里把两个组件的添加都放到回调里面。

PlayerController

在Logic文件夹中新建Player文件夹,并在其中新建PlayerController脚本

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
using UnityEngine;

public class PlayerController : MonoBehaviour
{
private MoveComponent _moveCo;
void Start()
{
_moveCo = GetComponent<MoveComponent>();
InputMgr.Instance.AddKeyListener(KeyCode.W);
InputMgr.Instance.AddKeyListener(KeyCode.A);
InputMgr.Instance.AddKeyListener(KeyCode.S);
InputMgr.Instance.AddKeyListener(KeyCode.D);

MessageMgr.Instance.AddInputLintener(KeyCode.W, InputState.PRESS, ReceiveW);
MessageMgr.Instance.AddInputLintener(KeyCode.S, InputState.PRESS, ReceiveS);
MessageMgr.Instance.AddInputLintener(KeyCode.A, InputState.PRESS, ReceiveA);
MessageMgr.Instance.AddInputLintener(KeyCode.D, InputState.PRESS, ReceiveD);
}
private void OnDestroy()
{
InputMgr.Instance.RemoveKeyListener(KeyCode.W);
InputMgr.Instance.RemoveKeyListener(KeyCode.A);
InputMgr.Instance.RemoveKeyListener(KeyCode.S);
InputMgr.Instance.RemoveKeyListener(KeyCode.D);

MessageMgr.Instance.RemoveInputLintener(KeyCode.W, InputState.PRESS, ReceiveW);
MessageMgr.Instance.RemoveInputLintener(KeyCode.S, InputState.PRESS, ReceiveS);
MessageMgr.Instance.RemoveInputLintener(KeyCode.A, InputState.PRESS, ReceiveA);
MessageMgr.Instance.RemoveInputLintener(KeyCode.D, InputState.PRESS, ReceiveD);
}
void ReceiveW(params object[] args)
{
_moveCo.Move(Vector2.up);
}
void ReceiveS(params object[] args)
{
_moveCo.Move(Vector2.down);
}
void ReceiveA(params object[] args)
{
_moveCo.Move(Vector2.left);
}
void ReceiveD(params object[] args)
{
_moveCo.Move(Vector2.right);
}
}

这里的MoveComponent在下一节介绍