ボスの機能の作成②(ビーム砲)
![Efb1447d ca7b 4370 a9d9 b7ffb10ba4ee](https://codegenius.org/uploads/slide/image/7751/efb1447d-ca7b-4370-a9d9-b7ffb10ba4ee.jpeg)
![Eeeb4638 b3c2 4e43 b8f7 8be0475e8d29](https://codegenius.org/uploads/slide/image/7752/eeeb4638-b3c2-4e43-b8f7-8be0475e8d29.jpeg)
![979ddf0d 9cf2 49f6 b334 423a48bbd5ba](https://codegenius.org/uploads/slide/image/7753/979ddf0d-9cf2-49f6-b334-423a48bbd5ba.jpeg)
![901173cb e26b 4b55 b488 b5195010ced2](https://codegenius.org/uploads/slide/image/7754/901173cb-e26b-4b55-b488-b5195010ced2.jpeg)
![D6679030 1817 4526 9cf3 c377faafc85b](https://codegenius.org/uploads/slide/image/7755/d6679030-1817-4526-9cf3-c377faafc85b.jpeg)
![Ab34981e 4f1f 4150 b00b 316149727fb5](https://codegenius.org/uploads/slide/image/7756/ab34981e-4f1f-4150-b00b-316149727fb5.jpeg)
![Cf20c85c ac97 4852 90fb 5b943e8df9c8](https://codegenius.org/uploads/slide/image/7757/cf20c85c-ac97-4852-90fb-5b943e8df9c8.jpeg)
ビーム砲に被弾した場合の処理
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.SceneManagement;
public class PlayerHealth : MonoBehaviour
{
public GameObject effectPrefab;
public AudioClip damageSound;
public AudioClip destroySound;
public int maxHP;
private int HP;
public Slider HPSlider;
public int playerCount;
public TextMeshProUGUI playerLabel;
void Start()
{
HP = maxHP;
HPSlider.maxValue = HP;
HPSlider.value = HP;
playerLabel.text = "" + playerCount;
}
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("EnemyMissile"))
{
HP -= 1;
AudioSource.PlayClipAtPoint(damageSound, Camera.main.transform.position);
Destroy(other.gameObject);
HPSlider.value = HP;
// ★改良
HPZero();
}
// ★追加
if(other.CompareTag("EnemyBeam"))
{
HP = 0;
HPSlider.value = HP;
HPZero();
}
}
void Retry()
{
this.gameObject.SetActive(true);
HP = maxHP;
HPSlider.maxValue = HP;
HPSlider.value = HP;
GetComponent<PlayerMovement>().ResetMoveSpeed();
GetComponentInChildren<FireMissile>().ResetShot();
}
// ★改良
// 何度も使う処理はメソッド化すると便利(テクニック)
// コードをこの中に移動させる。
void HPZero()
{
if (HP == 0)
{
GameObject effect = Instantiate(effectPrefab, transform.position, Quaternion.identity);
Destroy(effect, 1.0f);
AudioSource.PlayClipAtPoint(destroySound, Camera.main.transform.position);
this.gameObject.SetActive(false);
playerCount -= 1;
playerLabel.text = "" + playerCount;
GetComponent<OptionController>().ResetOption();
if (playerCount > 0)
{
Invoke("Retry", 1.0f);
}
else
{
SceneManager.LoadScene("GameOver");
}
}
}
}
![F84cd948 a695 4f91 9978 6c767c21eb60](https://codegenius.org/uploads/slide/image/7758/f84cd948-a695-4f91-9978-6c767c21eb60.jpeg)
![D6f34e86 2823 499e beb6 81e06c5c780d](https://codegenius.org/uploads/slide/image/7759/d6f34e86-2823-499e-beb6-81e06c5c780d.jpeg)
![F26e7f7b bfd8 4ca3 b766 8486e66fa8d3](https://codegenius.org/uploads/slide/image/7760/f26e7f7b-bfd8-4ca3-b766-8486e66fa8d3.jpeg)
ビーム砲の発射
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BossCore : MonoBehaviour
{
public Material[] materials;
private int num = 0;
// ★追加(ビーム砲)
public GameObject beamPrefab;
public GameObject target;
private void Start()
{
StartCoroutine(ChangeColor());
}
// ★追加(ビーム砲)
// 自機狙いの機能
private void Update()
{
transform.LookAt(target.transform);
}
private IEnumerator ChangeColor()
{
while (true)
{
yield return new WaitForSeconds(5f);
num = (num + 1) % materials.Length;
this.gameObject.GetComponent<MeshRenderer>().material = materials[num];
// ★追加(ビーム砲の発射)
// ここでは0.3秒ごとにビーム砲を7個発射する。
if (num == 3)
{
for (int i = 0; i < 7; i++)
{
GameObject beam = Instantiate(beamPrefab, transform.position, transform.rotation);
Rigidbody beamRb = beam.GetComponent<Rigidbody>();
beamRb.AddForce(transform.forward * 1000);
Destroy(beam, 3.0f);
yield return new WaitForSeconds(0.3f);
}
}
}
}
}
![0cead1d0 1b78 4228 8c74 05f9f53ef5b5](https://codegenius.org/uploads/slide/image/7761/0cead1d0-1b78-4228-8c74-05f9f53ef5b5.jpeg)
![615044aa 7a2d 4608 88fe dd5377e6c84b](https://codegenius.org/uploads/slide/image/7762/615044aa-7a2d-4608-88fe-dd5377e6c84b.jpeg)
【2021版】Danmaku(基礎/全55回)
他のコースを見る![Efb1447d ca7b 4370 a9d9 b7ffb10ba4ee](https://codegenius.org/uploads/slide/image/7751/efb1447d-ca7b-4370-a9d9-b7ffb10ba4ee.jpeg)
![Eeeb4638 b3c2 4e43 b8f7 8be0475e8d29](https://codegenius.org/uploads/slide/image/7752/eeeb4638-b3c2-4e43-b8f7-8be0475e8d29.jpeg)
![979ddf0d 9cf2 49f6 b334 423a48bbd5ba](https://codegenius.org/uploads/slide/image/7753/979ddf0d-9cf2-49f6-b334-423a48bbd5ba.jpeg)
![901173cb e26b 4b55 b488 b5195010ced2](https://codegenius.org/uploads/slide/image/7754/901173cb-e26b-4b55-b488-b5195010ced2.jpeg)
![D6679030 1817 4526 9cf3 c377faafc85b](https://codegenius.org/uploads/slide/image/7755/d6679030-1817-4526-9cf3-c377faafc85b.jpeg)
![Ab34981e 4f1f 4150 b00b 316149727fb5](https://codegenius.org/uploads/slide/image/7756/ab34981e-4f1f-4150-b00b-316149727fb5.jpeg)
![Cf20c85c ac97 4852 90fb 5b943e8df9c8](https://codegenius.org/uploads/slide/image/7757/cf20c85c-ac97-4852-90fb-5b943e8df9c8.jpeg)
ビーム砲に被弾した場合の処理
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
using UnityEngine.SceneManagement;
public class PlayerHealth : MonoBehaviour
{
public GameObject effectPrefab;
public AudioClip damageSound;
public AudioClip destroySound;
public int maxHP;
private int HP;
public Slider HPSlider;
public int playerCount;
public TextMeshProUGUI playerLabel;
void Start()
{
HP = maxHP;
HPSlider.maxValue = HP;
HPSlider.value = HP;
playerLabel.text = "" + playerCount;
}
private void OnTriggerEnter(Collider other)
{
if(other.CompareTag("EnemyMissile"))
{
HP -= 1;
AudioSource.PlayClipAtPoint(damageSound, Camera.main.transform.position);
Destroy(other.gameObject);
HPSlider.value = HP;
// ★改良
HPZero();
}
// ★追加
if(other.CompareTag("EnemyBeam"))
{
HP = 0;
HPSlider.value = HP;
HPZero();
}
}
void Retry()
{
this.gameObject.SetActive(true);
HP = maxHP;
HPSlider.maxValue = HP;
HPSlider.value = HP;
GetComponent<PlayerMovement>().ResetMoveSpeed();
GetComponentInChildren<FireMissile>().ResetShot();
}
// ★改良
// 何度も使う処理はメソッド化すると便利(テクニック)
// コードをこの中に移動させる。
void HPZero()
{
if (HP == 0)
{
GameObject effect = Instantiate(effectPrefab, transform.position, Quaternion.identity);
Destroy(effect, 1.0f);
AudioSource.PlayClipAtPoint(destroySound, Camera.main.transform.position);
this.gameObject.SetActive(false);
playerCount -= 1;
playerLabel.text = "" + playerCount;
GetComponent<OptionController>().ResetOption();
if (playerCount > 0)
{
Invoke("Retry", 1.0f);
}
else
{
SceneManager.LoadScene("GameOver");
}
}
}
}
![F84cd948 a695 4f91 9978 6c767c21eb60](https://codegenius.org/uploads/slide/image/7758/f84cd948-a695-4f91-9978-6c767c21eb60.jpeg)
![D6f34e86 2823 499e beb6 81e06c5c780d](https://codegenius.org/uploads/slide/image/7759/d6f34e86-2823-499e-beb6-81e06c5c780d.jpeg)
![F26e7f7b bfd8 4ca3 b766 8486e66fa8d3](https://codegenius.org/uploads/slide/image/7760/f26e7f7b-bfd8-4ca3-b766-8486e66fa8d3.jpeg)
ビーム砲の発射
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BossCore : MonoBehaviour
{
public Material[] materials;
private int num = 0;
// ★追加(ビーム砲)
public GameObject beamPrefab;
public GameObject target;
private void Start()
{
StartCoroutine(ChangeColor());
}
// ★追加(ビーム砲)
// 自機狙いの機能
private void Update()
{
transform.LookAt(target.transform);
}
private IEnumerator ChangeColor()
{
while (true)
{
yield return new WaitForSeconds(5f);
num = (num + 1) % materials.Length;
this.gameObject.GetComponent<MeshRenderer>().material = materials[num];
// ★追加(ビーム砲の発射)
// ここでは0.3秒ごとにビーム砲を7個発射する。
if (num == 3)
{
for (int i = 0; i < 7; i++)
{
GameObject beam = Instantiate(beamPrefab, transform.position, transform.rotation);
Rigidbody beamRb = beam.GetComponent<Rigidbody>();
beamRb.AddForce(transform.forward * 1000);
Destroy(beam, 3.0f);
yield return new WaitForSeconds(0.3f);
}
}
}
}
}
![0cead1d0 1b78 4228 8c74 05f9f53ef5b5](https://codegenius.org/uploads/slide/image/7761/0cead1d0-1b78-4228-8c74-05f9f53ef5b5.jpeg)
![615044aa 7a2d 4608 88fe dd5377e6c84b](https://codegenius.org/uploads/slide/image/7762/615044aa-7a2d-4608-88fe-dd5377e6c84b.jpeg)
ボスの機能の作成②(ビーム砲)