前提
実現したいこと
プレイヤーAとプレイヤーBがキャラクターをそれぞれ選択し戦う2D対戦ゲームを作りたいと考えています。
キャラクター選択画面で選択したキャラクターがゲーム画面に出てくるようにしたいです。
プレイヤーAがキャラクターを選択ボタンを押した後に決定ボタンを押し、プレイヤーBも同様に決定ボタンを押して、最後にスタートボタンを押すことでゲームシーンへと遷移させたいです。
PlayerPrefsを用いて、選択したキャラクターの番号に応じて呼び出すAnimatorを切り替えたいと考えています。
現状はとりあえず
発生している問題・エラーメッセージ
質問は全部で3つあります。
一つ目・・・選択したキャラクターの番号(Aの値)がゲームシーンのDebug.Log では常に0となっていて、原因がわからず困っています。
二つ目・・・プレイヤーAとプレイヤーBが同じ画面でキャラクターを選択したいです。一つのボタンのOnclickには一つのメソッドしか指定できないので、同じボタンをプレイヤーA用とB用に2つ作成するか、別のシーンを新たに加える必要があるのでしょうか。同じボタンを複数のメソッドから参照することはやはりできないのでしょうか。
三つ目・・・GameManager スクリプト上で選択したキャラクターによらず、キャラクターの移動を常に矢印キーでできるようにしたいのですが、void updateの animator1.SetFloat("Speed1", Mathf.Abs(x));の部分がAnimatorクラスの名前によって変わるため、この部分だけAの値によって場合分けしているのですが、非効率的でしょうか。何か改善案がありましたらご教授いただければ幸いです。
該当のソースコード
キャラクター選択スクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class CharacterSelect: MonoBehaviour
{
int selectCharaNumberforA;
int selectCharaNumberforB;
void Start()
{
selectCharaNumberforA = 0;
}
public void OnClickA() { selectCharaNumberforA = 0; Debug.Log("キャラ1"); } public void OnClickB() { selectCharaNumberforA = 1; Debug.Log("キャラ2"); } public void OnClickC() { selectCharaNumberforA = 2; } public void PlayerAdecision() { Debug.Log("プレイヤーA決定"); PlayerPrefs.SetInt("PlayerA", selectCharaNumberforA); //プレイヤーAという名前で値を保存 //SceneManager.LoadScene("GameScene"); }
// public void OnClickA2()
// {
// selectCharaNumberforB = 0;
// }
//public void OnClickB2() //{ // selectCharaNumberforB = 1; //} //public void OnClickC2() //{ // selectCharaNumberforB = 2; //} //public void PlayerBdecision() //{ // PlayerPrefs.SetInt("PlayerB", selectCharaNumberforB); //} public void OnClickStart() { SceneManager.LoadScene("GameScene"); }
}
ゲームスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManager : MonoBehaviour
{
public float moveSpeed = 3f;
Rigidbody2D rbA;
Rigidbody2D rbB;
Animator animator1;
Animator animator2;
Animator animator3;
Animator animator4;
Animator animator5;
int A; int B; void Start() { int PlayerA = PlayerPrefs.GetInt("PlayerA"); int PlayerB = PlayerPrefs.GetInt("PlayerB"); A = PlayerA; B = PlayerB; Debug.Log(A); // Debug.Log(B); rbA = GetComponent<Rigidbody2D>(); rbB = GetComponent<Rigidbody2D>(); if (PlayerA == 0) { animator1 = GetComponent<Animator>(); } else if (PlayerA == 1) { animator2 = GetComponent<Animator>(); } else if (PlayerA == 2) { animator3 = GetComponent<Animator>(); } else if (PlayerA == 3) { animator4 = GetComponent<Animator>(); } else if (PlayerA == 4) { animator5 = GetComponent<Animator>(); } if (PlayerB == 0) { animator1 = GetComponent<Animator>(); } else if (PlayerB == 1) { animator2 = GetComponent<Animator>(); } else if (PlayerB == 2) { animator3 = GetComponent<Animator>(); } else if (PlayerB == 3) { animator4 = GetComponent<Animator>(); } else if (PlayerB == 4) { animator5 = GetComponent<Animator>(); } } void Update() //上手く動作していないため、PlayerAののスクリプトのみ記述しています。 { float x = Input.GetAxisRaw("Horizontal"); rbA.velocity = new Vector2(x * moveSpeed, rbA.velocity.y); if (x > 0) { transform.localScale = new Vector2(0.6f, 0.5f); } if (x < 0) { transform.localScale = new Vector2(-0.6f, 0.5f); } if (A == 0) { animator1.SetFloat("Speed1", Mathf.Abs(x)); //走るアニメーションへの遷移 } else if (A == 1) { animator2.SetFloat("Speed1", Mathf.Abs(x)); } else if (A == 2) { animator3.SetFloat("Speed1", Mathf.Abs(x)); } else if (A == 3) { animator4.SetFloat("Speed1", Mathf.Abs(x)); } else if (A == 4) { animator5.SetFloat("Speed1", Mathf.Abs(x)); }
}
}
試したこと
キャラクターを選択するボタン、プレイヤーAがキャラクター選択を決定するボタンをDebug.Logで確認した結果、機能していました。
補足情報(FW/ツールのバージョンなど)
あなたの回答
tips
プレビュー