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

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

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

Q&A

解決済

2回答

1297閲覧

unity2Dゲームでのダメージを受けた時の点滅処理

marine08

総合スコア14

0グッド

0クリップ

投稿2020/07/05 23:01

シューテングゲームを作っています。playereがenemymissileを受けた時に、点滅する処理・後退する処理をつけようとしていますが、 「静的でないフィールド、メソッド、またはプロパティ 'OnDamage.damageMove()' で、オブジェクト参照が必要です」
というメッセージが出てきており、困っています。アドバイスをいただけると嬉しいです。
***以下playerにつけているスクリプト****
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerManager : MonoBehaviour
{
public Transform firePoint;
public GameObject bulletPrefab;
AudioSource audioSource;
public AudioClip shotSE;
public FixedJoystick joystick;

public int score; public void Start() { audioSource = GetComponent<AudioSource>(); }

public void Update()
{

Move(); }

public void Move()
{
float x = joystick.Horizontal;
float y = joystick.Vertical;
Vector3 nextPosition = transform.position + new Vector3(x, y, 0) * Time.deltaTime * 4f;
//x( 2.3 -2.3)y( 4 -4)
nextPosition = new Vector3(
Mathf.Clamp(nextPosition.x,-2.3f,2.3f),
Mathf.Clamp(nextPosition.y, -4f, 4f),
nextPosition.z

) ; transform.position = nextPosition; } public void OnTriggerEnter2D(Collider2D collision) { if (collision.CompareTag("EnemyMissile") == true) { gameObject.SendMessage("onDamage"); **__ OnDamage.damageMove();__**⇦ここにエラー文が出ます } }

}

****以下ダメージ内容を書いたスクリプト
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class OnDamage : MonoBehaviour
{
public bool on_damage = false; //ダメージフラグ
private SpriteRenderer renderer;

// Start is called before the first frame update void Start() { //点滅処理の為に呼び出しておく renderer = gameObject.GetComponent<SpriteRenderer>(); } // Update is called once per frame void Update() { if (on_damage) { float level = Mathf.Abs(Mathf.Sin(Time.time * 10)); renderer.color = new Color(1f, 1f, 1f, level); } } // ダメージを受けた際の動き public void damageMove() { // ダメージフラグON on_damage = true; // プレイヤーの位置を後ろに飛ばす float s = 100f * Time.deltaTime; transform.Translate(Vector3.up * s); // プレイヤーのlocalScaleでどちらを向いているのかを判定 if (transform.localScale.x >= 0) { transform.Translate(Vector3.left * s); } else { transform.Translate(Vector3.right * s); } // コルーチン開始 StartCoroutine("WaitForIt"); } IEnumerator WaitForIt() { // 1秒間処理を止める yield return new WaitForSeconds(1); // 1秒後ダメージフラグをfalseにして点滅を戻す on_damage = false; renderer.color = new Color(1f, 1f, 1f, 1f); } }

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

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

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

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

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

guest

回答2

0

分かりやすい解説ありがとうございます。
コードの読みづらさ、失礼しました。工夫していきます。

投稿2020/07/06 04:28

marine08

総合スコア14

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

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

0

ベストアンサー

クラスOnDamageはstaticなクラスではないため、一度生成し、変数にて保持しておく必要があります。
なお、MonoBehaviourを継承したクラスはnewできないため、Inspectorにて直接参照するか、GetComponentで取得する必要があります。

public OnDamage onDamage; void Start(){ onDamage = this.GetComponent<OnDamage>(); } public void Move(){ // 略 onDamage.damageMove(); }

あと質問内容とは直接関係ないですが、コードが非常に読みづらくなりますので、```にてスクリプトを囲むように記述してください。

投稿2020/07/05 23:28

yuuyu

総合スコア1139

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問