質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

531閲覧

このバグがどうしてもわかりません助けてください。

Fuwa

総合スコア49

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2022/01/22 10:07

編集2022/01/23 16:40

敵の攻撃をくらったらノックバックする機能追加したいのですが、
正常に動きませんどうしてもわからないので治し方を教えて頂ければ助かります:

見出し1 PlayerController

public class PlayerController : MonoBehaviour { [SerializeField, Tooltip("移動スピード")] private int moveSpeed; [SerializeField] private Animator playerAnim; [SerializeField] private Animator weaponAnim; [System.NonSerialized] public int currentHealth; public int maxHealth; //ノックバック判定 private bool isknockingBack; //ノックバックの方向 private Vector2 knockDir; //ノックバックの時間/ノックバック力 [SerializeField] private float knockbacklTime, knockbackForce; //タイマー private float knockbackCounter; //無敵時間 [SerializeField] private float invincibiltyTime; //タイマー private float invincibiltyCounter; public Rigidbody2D rb; void Start() { currentHealth = maxHealth; GameManager.instance.UpdatHealthUI(); } // Update is called once per frame void Update() { //無敵時間 if (invincibiltyCounter > 0) { invincibiltyCounter -= Time.deltaTime; } //ノックバック if (isknockingBack) { knockbackCounter -= Time.deltaTime; rb.velocity = knockDir * knockbackForce; ////ノックバック終了 if (knockbackCounter <= 0) { isknockingBack = false; } else { return; } } rb.velocity = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical")).normalized * moveSpeed; if (rb.velocity != Vector2.zero) { if (Input.GetAxisRaw("Horizontal") != 0) { if (Input.GetAxisRaw("Horizontal") > 0) { playerAnim.SetFloat("X", 1); playerAnim.SetFloat("Y", 0); weaponAnim.SetFloat("X", 1); weaponAnim.SetFloat("Y", 0); } else { playerAnim.SetFloat("X", -1); playerAnim.SetFloat("Y", 0); weaponAnim.SetFloat("X", -1); weaponAnim.SetFloat("Y", 0); } } else if (Input.GetAxisRaw("Vertical") > 0) { playerAnim.SetFloat("X", 0); playerAnim.SetFloat("Y", 1); weaponAnim.SetFloat("X", 0); weaponAnim.SetFloat("Y", 1); } else { playerAnim.SetFloat("X", 0); playerAnim.SetFloat("Y", -1); weaponAnim.SetFloat("X", 0); weaponAnim.SetFloat("Y", -1); } } //0 = 左クリック if (Input.GetMouseButtonDown(0)) { weaponAnim.SetTrigger("Attack"); } } /// <summary> ///吹き飛ばし用の関数 /// </summary> /// <param name="position"></param> /// public void KnockBack(Vector3 position) { //ノックバック knockbackCounter = knockbacklTime; isknockingBack = true; transform.position - position;   //自分のtransform.position から引数のpositionを引く knockDir = transform.position - position; knockDir.Normalize();// 正規化 } // public void DamgePlayer(int damage) { //0よりinvincibiltyCounter大きければ if (invincibiltyCounter <= 0) { currentHealth = Mathf.Clamp(currentHealth - damage, 0, maxHealth); invincibiltyCounter = invincibiltyTime; //currentHealthが0等しいなら if(currentHealth == 0) { gameObject.SetActive(false); } } GameManager.instance.UpdatHealthUI(); } }

見出し 2EnamyController

public class EnamyController : MonoBehaviour { //変数の宣言 //追いかける判定 [SerializeField, Tooltip("プレイヤーを追いかける")] private bool chase; //追いかける判定 private bool isChaseing; //chaseSpeed気づく範囲 rangeToChaseスピード [SerializeField] private float chaseSpeed, rangeToChase; //plater位置 private Transform Target; //攻撃間隔 [SerializeField] private float waitAfterHitting; //攻撃力 [SerializeField] private int attckDamage; private Rigidbody2D rb; private Animator enamyAnim; //waitTime = 止まる時間 walkTime動く時間 [SerializeField] private float moveSpeed, waitTime, walkTime; private float waitCounter, moveCounter; private Vector2 moveDir; [SerializeField] private BoxCollider2D area; void Start() { rb = GetComponent<Rigidbody2D>(); enamyAnim = GetComponent<Animator>(); //waitCounterにさっき設定したwaitTimeを格納する waitCounter = waitTime; Target = GameObject.FindGameObjectWithTag("Player").transform; } //敵のさまよう実装 void Update() { if (!isChaseing) { if (waitCounter > 0) { waitCounter -= Time.deltaTime; rb.velocity = Vector2.zero; if (waitCounter <= 0) { moveCounter = walkTime; enamyAnim.SetBool("moving", true); moveDir = new Vector2(Random.Range(-1f, 1f), Random.Range(-1f, 1f)); moveDir.Normalize(); } } else { moveCounter -= Time.deltaTime; rb.velocity = moveDir * moveSpeed; if (moveCounter <= 0) { enamyAnim.SetBool("moving", false); waitCounter = waitTime; } //追跡 if (chase) { if (Vector3.Distance(transform.position,Target.transform.position) < rangeToChase) { isChaseing = true; } } } } else { if (waitCounter > 0) { waitCounter -= Time.deltaTime; rb.velocity = Vector2.zero; if (waitCounter <= 0) { enamyAnim.SetBool("moving", true); } } else { moveDir = Target.transform.position - transform.position; moveDir.Normalize(); // 正規化 rb.velocity = moveDir * chaseSpeed ; } if (chase) { if (Vector3.Distance(transform.position, Target.transform.position) > rangeToChase) { isChaseing = false; waitCounter = waitTime; enamyAnim.SetBool("moving", false); } } } transform.position = new Vector3(Mathf.Clamp(transform.position.x, area.bounds.min.x + 1, area.bounds.max.x - 1) , Mathf.Clamp(transform.position.y, area.bounds.min.y + 1, area.bounds.max.x - 1), transform.position.z); } private void OnCollisionEnter2D(Collision2D collision) { if(collision.gameObject.tag == "Player") { if(isChaseing) { //PlayerController を扱えるようにする PlayerController player = collision.gameObject.GetComponent<PlayerController>(); player.KnockBack(transform.position);//PlayerControllerのKnockBackの引数にtransform.positionを入れる player.DamgePlayer(attckDamage);//PlayerControllerのDamgePlayerの引数にtransform.positionを入れる //攻撃感覚に止まる時間を代入する waitCounter = waitAfterHitting; enamyAnim.SetBool("moving", false) ; } } } }

見出し 3GameManager

//HPパネルの管理 public static GameManager instance; // Start is called before the first frame update [SerializeField] private Slider hpSlder; [SerializeField] private PlayerController player; private void Awake() { if(instance == null) { instance = this; } } void Start() { } // Update is called once per frame void Update() { } public void UpdatHealthUI() { hpSlder.maxValue = player.maxHealth; hpSlder.value = player.currentHealth; } }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YT0014

2022/01/22 10:21

タグ「RPG」は、AS/400用のプログラム言語の為のタグです。無関係だと思われますので、質問を編集して同タグを削除されることをお勧めします。
y_waiwai

2022/01/22 10:45

正常に動かないとはどういうふうに動くんでしょうか。詳しく説明しよう
Fuwa

2022/01/22 11:06

ノックバックそのものが動きませんでした。
YT0014

2022/01/23 07:40

治し方の前に、何が起きているかを正確に把握してください。 関数KnockBack()は想定通りに呼ばれていますか? knockbackCounterなどの変数は、想定通りに設定され、想定通りに変化していますか? 想定と実際の値を、質問文を編集して、ご提示ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問