change gamemanager

This commit is contained in:
kimura 2022-06-20 15:27:07 +09:00
parent 9fcb809215
commit d83a12f741
3 changed files with 101 additions and 77 deletions

View File

@ -1,6 +1,5 @@
using System; using System;
using UniRx; using UniRx;
using UniRx.Diagnostics;
using UniRx.Triggers; using UniRx.Triggers;
using UnityEngine; using UnityEngine;
@ -8,7 +7,12 @@ namespace MyGame.Scenes.MiniGame.Scripts
{ {
public class GameManager : MonoBehaviour public class GameManager : MonoBehaviour
{ {
public enum State public enum MenuState
{
StageSelect,
Game,
}
public enum GameState
{ {
Ready, Ready,
Play, Play,
@ -16,55 +20,57 @@ namespace MyGame.Scenes.MiniGame.Scripts
Failure Failure
} }
[SerializeField] private float speed = 1f;
[SerializeField] private float jumpTime = .8f;
[SerializeField] private float jumpHeight = 2f;
[SerializeField] private float timeLimit = 30f; [SerializeField] private float timeLimit = 30f;
[SerializeField] private HeaderView headerView; [SerializeField] private HeaderView headerView;
[SerializeField] private Transform characterTransform; [SerializeField] private Player player;
[SerializeField] private StageManager stageManager;
private readonly ReactiveProperty<MenuState> menuState = new ReactiveProperty<MenuState>();
private readonly ReactiveProperty<GameState> state = new ReactiveProperty<GameState>();
private readonly ReactiveProperty<State> state = new ReactiveProperty<State>();
private IDisposable timerDisposable; private IDisposable timerDisposable;
// Start is called before the first frame update // Start is called before the first frame update
private void Start() private void Start()
{ {
menuState.AddTo(this);
state.AddTo(this); state.AddTo(this);
state.Value = State.Ready; menuState.Value = MenuState.Game;
state.Value = GameState.Ready;
menuState.Subscribe(x =>
{
switch (x)
{
case MenuState.StageSelect:
break;
case MenuState.Game:
break;
default:
throw new ArgumentOutOfRangeException(nameof(x), x, null);
}
}).AddTo(this);
this.UpdateAsObservable() this.UpdateAsObservable()
.Where(_ => menuState.Value == MenuState.Game)
.Where(_ => Input.GetMouseButtonDown(0)) .Where(_ => Input.GetMouseButtonDown(0))
// .Debug("tap")
.Subscribe(_ => .Subscribe(_ =>
{ {
ChangeState(); state.Value = GameState.Play;
}).AddTo(this); }).AddTo(this);
var cameraTransform = Camera.main.transform;
this.UpdateAsObservable()
.Where(_ => state.Value == State.Play)
.DelayFrame(1)
.Subscribe(_ =>
{
// カメラ移動
cameraTransform.AddPositionX(speed * Time.deltaTime);
// キャラクター移動
characterTransform.AddPositionX(speed * Time.deltaTime);
if (Input.GetMouseButtonDown(0))
{
Jump();
}
}).AddTo(this);
state.Subscribe(x => state.Subscribe(x =>
{ {
switch (x) switch (x)
{ {
case State.Ready: case GameState.Ready:
timerDisposable?.Dispose();
headerView.ResetView(); headerView.ResetView();
headerView.ChangeTimeCount(timeLimit); headerView.ChangeTimeCount(timeLimit);
break; break;
case State.Play: case GameState.Play:
timerDisposable?.Dispose(); timerDisposable?.Dispose();
timerDisposable = Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1f)) timerDisposable = Observable.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(1f))
.Select(time => (int)(timeLimit - time)) .Select(time => (int)(timeLimit - time))
@ -76,16 +82,33 @@ namespace MyGame.Scenes.MiniGame.Scripts
{ {
}).AddTo(this); }).AddTo(this);
break; break;
case State.Success: case GameState.Success:
break; break;
case State.Failure: case GameState.Failure:
break; break;
default: default:
throw new ArgumentOutOfRangeException(nameof(x), x, null); throw new ArgumentOutOfRangeException(nameof(x), x, null);
} }
}).AddTo(this); }).AddTo(this);
characterTransform.OnTriggerEnter2DAsObservable().Subscribe(x => var playerTransform = player.transform;
var cameraTransform = Camera.main.transform;
var cameraOffset = cameraTransform.position - playerTransform.position.x * Vector3.right;
this.UpdateAsObservable()
.Where(_ => state.Value == GameState.Play)
.DelayFrame(1)
.Subscribe(_ =>
{
player.Move();
// カメラ移動
cameraTransform.position = playerTransform.position.x * Vector3.right + cameraOffset;
if (Input.GetMouseButtonDown(0))
{
player.Jump();
}
}).AddTo(this);
playerTransform.OnTriggerEnter2DAsObservable().Subscribe(x =>
{ {
var item = x.GetComponent<StageItem>(); var item = x.GetComponent<StageItem>();
if (item is null) if (item is null)
@ -103,49 +126,5 @@ namespace MyGame.Scenes.MiniGame.Scripts
} }
}).AddTo(this); }).AddTo(this);
} }
private bool isJump;
private void Jump()
{
if (isJump)
{
return;
}
isJump = true;
// Observable.Timer(TimeSpan.FromSeconds(.5f)).Subscribe(_ =>
// {
// isJump = false;
// }).AddTo(this);
// var basePosY = characterTransform.position.y;
// characterTransform.GetComponent<Rigidbody2D>().AddForce(Vector2.up * height, ForceMode2D.Impulse);
var cachePos = characterTransform.localPosition;
this.CallLerp(jumpTime, t =>
{
characterTransform.SetLocalPositionY(cachePos.y + Mathf.Sin(Mathf.PI * t) * jumpHeight);
}, () =>
{
isJump = false;
});
}
private void ChangeState()
{
switch (state.Value)
{
case State.Ready:
state.Value = State.Play;
break;
case State.Play:
break;
case State.Success:
break;
case State.Failure:
break;
default:
throw new ArgumentOutOfRangeException();
}
}
} }
} }

View File

@ -0,0 +1,42 @@
using System;
using UniRx;
using UniRx.Triggers;
using UnityEngine;
namespace MyGame.Scenes.MiniGame.Scripts
{
public class Player : MonoBehaviour
{
[SerializeField] private float speed = 5f;
[SerializeField] private float jumpTime = 1.25f;
[SerializeField] private float jumpHeight = 5f;
private bool isJump;
private void Start()
{
}
public void Move()
{
transform.AddPositionX(speed * Time.deltaTime);
}
public void Jump()
{
if (isJump)
{
return;
}
isJump = true;
var cachePos = transform.localPosition;
this.CallLerp(jumpTime, t =>
{
transform.SetLocalPositionY(cachePos.y + Mathf.Sin(Mathf.PI * t) * jumpHeight);
}, () =>
{
isJump = false;
});
}
}
}

View File

@ -0,0 +1,3 @@
fileFormatVersion: 2
guid: 2273f282da84488498cab0d1b34f1d63
timeCreated: 1655445441