(攻撃の作成)HoundXの作成
放物線を描きながらターゲットに着弾
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class HoundX : MonoBehaviourPunCallbacks
{
private Vector3 houndStart;
private Vector3 houndMiddle;
private Vector3 houndEnd;
void Update()
{
if (photonView.IsMine)
{
// Aボタンで発射
if (Input.GetKeyDown(KeyCode.A))
{
ShotHound();
}
}
}
void ShotHound()
{
GameObject target = GameObject.FindGameObjectWithTag("TargetMark");
// ベジェ曲線の制御点の取得
// 開始地点はこのHoundオブジェクト
houndStart = transform.position;
// 終点
// ターゲットが存在する場合にはそこが終点
if (target)
{
houndEnd = target.transform.position;
}
// 中間地点
houndMiddle = Vector3.Lerp(houndStart, houndEnd, 0.5f);
// 放物線を描くために中間地点のY軸を上に移動する。
houndMiddle.y += Random.Range(30, 50);
houndMiddle.x += Random.Range(-15, 15);
// Houndのスピードのコントロール
// 開始地点と終点が離れているほどゆっくりな速度になる。
float divide_Distance = 20 / Vector3.Distance(houndStart, houndEnd);
// コルーチンの開始
StartCoroutine(HoundManager(houndStart, houndEnd, houndMiddle, divide_Distance));
}
private IEnumerator HoundManager(Vector3 start, Vector3 end, Vector3 middle, float shot_speed)
{
// ペジェ曲線の変数
float t = 0.0f;
// ループを抜けるまで実行
while (true)
{
if (t > 1)
{
// 終点でこのオブジェクトを破壊する
PhotonNetwork.Destroy(this.gameObject);
// ループを抜ける
yield break;
}
// ペジェ曲線の計算
t += shot_speed * Time.deltaTime;
Vector3 a = Vector3.Lerp(start, middle, t);
Vector3 b = Vector3.Lerp(middle, end, t);
// 座標の代入
transform.position = Vector3.Lerp(a, b, t);
yield return null;
}
}
}
トリガーの選択
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class ShotTrigger : MonoBehaviourPunCallbacks
{
public GameObject[] shotAnchors;
// ★追加
public string[] triggers;
private int num = 0;
public GameObject markPrefab;
void Update()
{
if (photonView.IsMine)
{
// ★追加(複数のトリガーを選択できるように改良する)
// Wボタンでトリガーの「選択」
if (Input.GetKeyDown(KeyCode.W))
{
num = (num + 1) % triggers.Length;
}
if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.D))
{
foreach (GameObject anchor in shotAnchors)
{
StartCoroutine(Trigger(anchor));
}
// ★追加
// トリガーにHoundXをセットした時は、ターゲットマークを生成する。
if (triggers[num] == "HoundX")
{
StartCoroutine(SetMark());
}
}
}
}
private IEnumerator Trigger(GameObject createPoint)
{
// ★改良
GameObject trigger = PhotonNetwork.Instantiate(triggers[num], createPoint.transform.position, Camera.main.transform.rotation);
yield return new WaitForSeconds(5f);
if (trigger)
{
PhotonNetwork.Destroy(trigger.gameObject);
}
}
// ★追加
// ターゲットマークの生成&破壊
private IEnumerator SetMark()
{
RaycastHit hit;
if(Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit))
{
// Rayの当たった場所に「ターゲットマーク」を生成する。
// このターゲットマークにめがけて、HoundXが放物線を描きながら飛んでいく。
// ターゲットマークは他のプレーヤーと共有する必要がないので、通常のInstantiateを使う(ポイント)
GameObject mark = Instantiate(markPrefab, hit.point, Quaternion.identity);
// 5秒間待機
yield return new WaitForSeconds(5f);
Destroy(mark);
}
}
}
【2021版】BattleOnline(全37回)
他のコースを見る放物線を描きながらターゲットに着弾
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class HoundX : MonoBehaviourPunCallbacks
{
private Vector3 houndStart;
private Vector3 houndMiddle;
private Vector3 houndEnd;
void Update()
{
if (photonView.IsMine)
{
// Aボタンで発射
if (Input.GetKeyDown(KeyCode.A))
{
ShotHound();
}
}
}
void ShotHound()
{
GameObject target = GameObject.FindGameObjectWithTag("TargetMark");
// ベジェ曲線の制御点の取得
// 開始地点はこのHoundオブジェクト
houndStart = transform.position;
// 終点
// ターゲットが存在する場合にはそこが終点
if (target)
{
houndEnd = target.transform.position;
}
// 中間地点
houndMiddle = Vector3.Lerp(houndStart, houndEnd, 0.5f);
// 放物線を描くために中間地点のY軸を上に移動する。
houndMiddle.y += Random.Range(30, 50);
houndMiddle.x += Random.Range(-15, 15);
// Houndのスピードのコントロール
// 開始地点と終点が離れているほどゆっくりな速度になる。
float divide_Distance = 20 / Vector3.Distance(houndStart, houndEnd);
// コルーチンの開始
StartCoroutine(HoundManager(houndStart, houndEnd, houndMiddle, divide_Distance));
}
private IEnumerator HoundManager(Vector3 start, Vector3 end, Vector3 middle, float shot_speed)
{
// ペジェ曲線の変数
float t = 0.0f;
// ループを抜けるまで実行
while (true)
{
if (t > 1)
{
// 終点でこのオブジェクトを破壊する
PhotonNetwork.Destroy(this.gameObject);
// ループを抜ける
yield break;
}
// ペジェ曲線の計算
t += shot_speed * Time.deltaTime;
Vector3 a = Vector3.Lerp(start, middle, t);
Vector3 b = Vector3.Lerp(middle, end, t);
// 座標の代入
transform.position = Vector3.Lerp(a, b, t);
yield return null;
}
}
}
トリガーの選択
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class ShotTrigger : MonoBehaviourPunCallbacks
{
public GameObject[] shotAnchors;
// ★追加
public string[] triggers;
private int num = 0;
public GameObject markPrefab;
void Update()
{
if (photonView.IsMine)
{
// ★追加(複数のトリガーを選択できるように改良する)
// Wボタンでトリガーの「選択」
if (Input.GetKeyDown(KeyCode.W))
{
num = (num + 1) % triggers.Length;
}
if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.D))
{
foreach (GameObject anchor in shotAnchors)
{
StartCoroutine(Trigger(anchor));
}
// ★追加
// トリガーにHoundXをセットした時は、ターゲットマークを生成する。
if (triggers[num] == "HoundX")
{
StartCoroutine(SetMark());
}
}
}
}
private IEnumerator Trigger(GameObject createPoint)
{
// ★改良
GameObject trigger = PhotonNetwork.Instantiate(triggers[num], createPoint.transform.position, Camera.main.transform.rotation);
yield return new WaitForSeconds(5f);
if (trigger)
{
PhotonNetwork.Destroy(trigger.gameObject);
}
}
// ★追加
// ターゲットマークの生成&破壊
private IEnumerator SetMark()
{
RaycastHit hit;
if(Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit))
{
// Rayの当たった場所に「ターゲットマーク」を生成する。
// このターゲットマークにめがけて、HoundXが放物線を描きながら飛んでいく。
// ターゲットマークは他のプレーヤーと共有する必要がないので、通常のInstantiateを使う(ポイント)
GameObject mark = Instantiate(markPrefab, hit.point, Quaternion.identity);
// 5秒間待機
yield return new WaitForSeconds(5f);
Destroy(mark);
}
}
}
(攻撃の作成)HoundXの作成