code VR

Unity×VR(80)

スポンサーリンク

//tips

//衝突判定で暗闇を発生させる

先にボタンPUSHでpanelを呼び出し、それにアタッチされている透明度を変化させるスクリプトで一定時間の暗闇効果を表現したが、今度はEnemyへの衝突タイミングで同現象を発生させる。

これは衝突時にUIeffectdarkerスクリプトのUIDarkOn()メソッドを実行させれば良い。

赤いenemy cubeを作成し、oncollisionenterで衝突の際にUIDarkOn()メソッドを実行させる。これがマルチプレイの場合はphotonisMineなどを絡めて衝突相手シーン限定で発生させることになる。

下記スクリプトをenemyにアタッチし、動作確認を行なった。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Darkoncollision : MonoBehaviour
{
[SerializeField]
UIeffectdarker uieffectdarker;

private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.tag == "Player")
{
uieffectdarker.UIDarkOn();
}
}
}

シングルプレイヤーの場合の動作は問題なく確認できた。

//範囲攻撃

次は一定範囲の該当者全てにある効果を付与する機能を考える。

プレイヤーに円形のコライダーを与えておき、ボタンタッチの際にコライダーをアクティブにし、そのコライダーに接しているenemyをfreezeさせてみる。

rb.constraintsからフリーズとフリーズ解除ができるのでそちらの機能を使用する。

var rb = GetComponent<Rigidbody>();
rb.constraints = RigidbodyConstraints.FreezeAll;//フリーズ
rb.constraints = RigidbodyConstraints.None;//解除

また、一度に複数のコライダーの接触反応を取る必要がある。ボタンに下記スクリプトのOnField()をonclickで実行するようにしてみたが、OnCollisionのため地面のコライダーと反発して浮き上がり、接触させたAIにRigidbodyがついていないため判定が取れないことがわかった。実際はプレイヤーとの接触反応をさせるためRigidbodyはついているが、念のためRigidbodyがついていない場合にも対応できるようにしておく。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FieldonEnter : MonoBehaviour
{
Rigidbody rb;

private void Start()
{
GetComponent<SphereCollider>().enabled = false;
}

private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Enemy")
{
rb = GetComponent<Rigidbody>();
rb.constraints = RigidbodyConstraints.FreezeAll;
}
}

public void OnField()
{
GetComponent<SphereCollider>().enabled = true;
}
}

OnTriggerを使用してしまうと接触したコライダーのうち一つしか判定できないようなので、自分でコードを作成していく。

2つの方向性があるようで、

一つは、Physics.Raycast(transform.position, direction, 10)などレイを飛ばし、一定範囲内のオブジェクトを取得する方法、もう一つは、GameObject[] targets = GameObject.FindGameObjectsWithTag("Enemy”);などでシーン上の全てのオブジェクトを調べ、foreach (GameObject obj in targets) { float dist = Vector3.Distance(obj.transform.position,transform.position);
if (dist<marumaru {と自身からの距離を全て計測し、条件に合致するものを選び出す方法がある。

まずはレイを飛ばし、一定範囲内のオブジェクトを取得する方法を考える。

プレイヤーの周囲全方向にレイを飛ばす方法を模索していると、下記の参考を発見。

https://gametukurikata.com/basic/physicsray

https://docs.unity3d.com/ja/current/ScriptReference/Physics.SphereCastAll.html

Physics.SphereCastAllを利用できないか考えていく。少しプレイヤーの前方に範囲の中心が移動するが、球状のレイで空間でのオブジェクトの接触を取れる。

今回は下記のスクリプトでAIの動作を止めた。

using System.Collections;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.AI;

public class FieldonEnter : MonoBehaviour
{
Rigidbody rb;
SimpleCubeMove simpleCubeMove;

private void Start()
{
//GetComponent<SphereCollider>().enabled = false;
}

public void GetTargetfreeze()
{
float search_radius = 5f;

var hits = Physics.SphereCastAll(transform.position,search_radius,transform.forward, 0.01f).Select(h => h.transform.gameObject).ToList();

if (0 < hits.Count())
{
Debug.Log("a");
Debug.Log(hits);
foreach (var hit in hits)
{
Debug.Log(hit);

if (hit.tag == "Enemy")
{
simpleCubeMove = hit.GetComponent<SimpleCubeMove>();
simpleCubeMove.enabled = false;
Debug.Log("aaa");

//rb = hit.GetComponent<Rigidbody>();
//rb.constraints = RigidbodyConstraints.FreezeAll;
}
}
}
}
/*
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag == "Enemy")
{
rb = GetComponent<Rigidbody>();
rb.constraints = RigidbodyConstraints.FreezeAll;
}
}
public void OnField()
{
GetComponent<SphereCollider>().enabled = true;
}
*/
}

ストップボタンを押すことで、前方に球状の索敵空間を発生させ、索敵空間内に入ったAIについているスクリプトを強引に外した。索敵空間はレイなので目に見えない。

また、using System.Linq;を用いて、Raycast型を強引にList型に変えている。またリストに格納されるものも使いやすいようにgame objectとして格納している。

var hits = Physics.SphereCastAll(transform.position,search_radius,transform.forward, 0.01f).Select(h => h.transform.gameObject).ToList();

using System.Linq;は便利なのでもう少し突っ込んで調べてもいいかもしれない。

 

人気の記事

1

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

4

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-code, VR
-,

Copyright© BUSINESS HACKER , 2021 All Rights Reserved Powered by AFFINGER5.