Unity の Project TCC を触って、Unity の機能を学んでいきましょう。
Project TCC で遊ぼう~UC-03-05 Down and Wakeup: キャラクターがダウン状態になったり、そこから復帰できるようにします~
UC-03-05 Down and Wakeup
変更点の確認
UC-03-05_Down_and_Wakeup シーンを開きます。
Unityエディター上で再生して、ユニティちゃんを動かしてみましょう。
UC-03-04_Damage_and_Dodge シーンと違うところは、Player オブジェクトに Down の State Machine が追加されています。AnimatorController の IsDown パラメータが true になると Down ステートに移行します。
シーンの複製
UC-03-04_Damage_and_Dodge シーンを複製して、UC-03-05_Down_and_Wakeup_Copy という名前にします。
Level の複製
UC-03-05_Down_and_Wakeup_Copy シーンの Level オブジェクト(子オブジェクトも含む)を削除します。
UC-03-05_Down_and_Wakeup シーンの Level オブジェクトをコピー(Ctrl + C)して、UC-03-05_Down_and_Wakeup_Copy シーンに貼り付け(Ctrl + V)ます。
PlayerInput の設定
Player オブジェクトの PlayerInput コンポーネントの Actions に Assets/TCC/Scenes/03_Action/Data_UC-03-05_Down_and_Wakeup/UC-03-05_Down_and_Wakeup を設定します。
Animator の設定
Player オブジェクトの Animator コンポーネントの Controller に Assets/TCC/Scenes/03_Action/Data_UC-03-05_Down_and_Wakeup/UC-03-05_Down_and_Wakeup を設定します。
MyExplosion_03_05 の作成
ヒエラルキービューの Level/Trap/Explosion オブジェクトの StateMachine コンポーネントを削除します。
MyExplosion_03_05 スクリプトを新規作成して、Explosion オブジェクトに追加します。
Explosion オブジェクトの MyExplosion_03_05 スクリプトの Particles に Explosion/Particle System オブジェクトと Explosion/Particle System_Smoke オブジェクトを設定します。
Explosion オブジェクトの MyExplosion_03_05 スクリプトの Player に Player オブジェクトを設定します。
Explosion_1~Explosion_3 オブジェクトも同様にします。
MyExplosion_03_05 スクリプトの内容はこちらになります。
using NUnit.Framework;
using System.Collections.Generic;
using Unity.TinyCharacterController.Check;
using UnityEngine;
public class MyExplosion_03_05 : MonoBehaviour {
[SerializeField] private List<ParticleSystem> m_arParticles;
[SerializeField] private GameObject m_rPlayer;
private AnimatorModifierCheck m_rAnimatorModifierCheckPlayer;
private Animator m_rAnimatorPlayer;
private void Awake() {
m_rPlayer.TryGetComponent<AnimatorModifierCheck>(out m_rAnimatorModifierCheckPlayer);
m_rPlayer.TryGetComponent<Animator>(out m_rAnimatorPlayer);
}
private void OnTriggerEnter(Collider other) {
if (other.gameObject.tag == "Player") {
int nCount = 200;
foreach (ParticleSystem rParticle in m_arParticles) {
rParticle.Emit(nCount);
}
if (m_rAnimatorModifierCheckPlayer != null) {
if (m_rAnimatorModifierCheckPlayer.HasKey("Muteki") || m_rAnimatorModifierCheckPlayer.HasKey("Dodge")) {
}
else {
if (m_rAnimatorPlayer != null) {
m_rAnimatorPlayer.SetBool("IsDown", true);
}
}
}
}
}
}
MyPlayer_03_05 の作成
MyPlayer_03_05 スクリプトを新規作成して、Player オブジェクトに追加します。
MyPlayer_03_05 スクリプトの内容はこちらになります。
using Unity.TinyCharacterController.Check;
using Unity.TinyCharacterController.Control;
using UnityEngine;
using UnityEngine.InputSystem;
public class MyPlayer_03_05 : MonoBehaviour {
private PlayerInput m_rPlayerInput;
private InputAction m_rWakeup;
private Animator m_rAnimator;
private MoveControl m_rMoveControl;
private AnimatorModifierCheck m_rAnimatorModifierCheck;
private bool m_bIsDown;
private void Awake() {
TryGetComponent<PlayerInput>(out m_rPlayerInput);
if (m_rPlayerInput != null) {
m_rWakeup = m_rPlayerInput.actions["Wakeup"];
}
TryGetComponent<Animator>(out m_rAnimator);
TryGetComponent<MoveControl>(out m_rMoveControl);
TryGetComponent<AnimatorModifierCheck>(out m_rAnimatorModifierCheck);
}
private void Start() {
OnExitStateDown();
}
private void OnEnable() {
if (m_rWakeup != null) {
m_rWakeup.started += OnWakeup;
}
}
private void OnDisable() {
if (m_rWakeup != null) {
m_rWakeup.started -= OnWakeup;
}
}
private void Update() {
if (m_bIsDown) {
}
else {
if (m_rAnimator != null) {
if (m_rAnimator.GetBool("IsDown")) {
OnEnterStateDown();
}
}
}
}
private void OnEnterStateDown() {
m_bIsDown = true;
if (m_rPlayerInput != null) {
m_rPlayerInput.SwitchCurrentActionMap("Field_Down");
}
if (m_rAnimator != null) {
m_rAnimator.Play("Down");
}
if (m_rMoveControl != null) {
m_rMoveControl.Move(Vector2.zero);
}
}
private void OnExitStateDown() {
m_bIsDown = false;
if (m_rPlayerInput != null) {
m_rPlayerInput.SwitchCurrentActionMap("Field_Standing");
}
}
private void OnWakeup(InputAction.CallbackContext context) {
if (m_rAnimatorModifierCheck != null) {
if (!m_rAnimatorModifierCheck.HasKey("Wakeup")) {
if (m_rAnimator != null) {
m_rAnimator.SetTrigger("Wakeup");
m_rAnimator.SetBool("IsDown", false);
}
}
}
OnExitStateDown();
}
}
動作確認
Unityエディターで再生して、動作確認します。
Explosion オブジェクトの上を歩くとダウン状態になります。
ダウン状態のときに、マウスの右ボタンをクリックすると、復帰できます。
まとめ
Project TCC のキャラクターがダウン状態になるサンプルを Visual Scripting から C# スクリプトに変換して動かしてみました。
PlayerInput コンポーネントの ActionMap を切り替えることにより、ダウン状態の操作方法を切り替えることが出来ます。
コメント