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

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

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

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

受付中

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

Fuwa
Fuwa

総合スコア46

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

0回答

0評価

0クリップ

346閲覧

投稿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; } }

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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などの変数は、想定通りに設定され、想定通りに変化していますか? 想定と実際の値を、質問文を編集して、ご提示ください。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。