Unityでandroidゲームを制作しています。
ゲームに 残像表示、 ダメージを受けた時の数値表示 を実装しているのですが、
実機でゲームを起動し、起動後の一番最初にその処理が走るアクションを行った時(二段ジャンプ時や被ダメージ時)に重くなり、一秒ほど固まります。
しかし、重くなるのは最初の一回のみで、その後はシーン移行をしてもその処理で固まることはありませんでした。
該当のソースコード
//二段ジャンプ時などの残像表示
using UnityEngine;
using DG.Tweening;
public class AfterImage : MonoBehaviour
{
[SerializeField] Color color = Color.black;
[SerializeField] Material material = null;
[SerializeField] float fadeoutTime = 0.0f;
[SerializeField] Vector2 imageMagnification = Vector2.one;
private SpriteRenderer sprite; private GameObject obj; private GameObject afterImages; private Vector2 tmp = Vector2.one; void Start() { obj = this.gameObject; sprite = this.gameObject.GetComponent<SpriteRenderer>(); afterImages = new GameObject(this.gameObject.name + "AfterImage"); //残像オブジェクトを入れるからオブジェクトを作る } void Update() { //残像オブジェクトがないときはアクティブにしない if (afterImages.transform.childCount == 0) { afterImages.SetActive(false); } else { afterImages.SetActive(true); } } public void CreateAfterImage() { //オブジェクトを生成してスタート時に生成したオブジェクトの子にする var newObject = new GameObject(); newObject.transform.parent = afterImages.transform; //SpriteRendererコンポーネントを追加して対象オブジェクトのスプライトを代入 var newObjectSprite = newObject.AddComponent<SpriteRenderer>(); newObjectSprite.sprite = sprite.sprite; //positionとlocalScaleを対象オブジェクトに合わせる newObject.transform.position = obj.transform.position; newObject.transform.localScale = obj.transform.localScale * imageMagnification; //色とマテリアルを設定する newObjectSprite.color = color; newObjectSprite.material = material; //StartCoroutine("FadeoutSprite", newObjectSprite); //fadeoutTime秒かけてa = 0にフェードアウトして処理が完了したらデストロイする newObjectSprite.DOFade(0, fadeoutTime).OnComplete(() => { Destroy(newObjectSprite.gameObject); }); }
}
//被ダメージ時のダメージ数値の表示
using UnityEngine;
using TMPro;
public class DamageUICreate : MonoBehaviour
{
public static GameObject damageUIParent = null;
public static GameObject damageUIObj = null;
public static float addY = 0.0f;
[SerializeField] private GameObject _damageUIParent = null; [SerializeField] private GameObject _damageUIObj = null; [SerializeField] private float _addY = 0.0f; private void Awake() { damageUIParent = _damageUIParent; damageUIObj = _damageUIObj; addY = _addY; } public static void CreateDamage(Vector3 position, float damage) { var damageText = Instantiate(damageUIObj); damageText.transform.SetParent(damageUIParent.transform, false); damageText.GetComponent<TextMeshProUGUI>().text = string.Format("{0}", damage); damageText.transform.position = position += new Vector3(0f, addY, 0f); }
}
##試したこと
そのプログラムが呼ばれたときにStartメソッドが実行されているのではと思い、startメソッドに
Debug.Logを書き確認してみたのですが、ちゃんとシーンがスタートした瞬間にログが出た。
補足情報(FW/ツールのバージョンなど)
Unity2020.1.6f1 Personal
あなたの回答
tips
プレビュー