//tips
//複数カメラの制御
プレイヤーの子要素としてCameraControllerを扱い、prefab化したプレイヤーからでもカメラの切り替えをできるように考える。
一旦2つのカメラの切り替えをおこなすスクリプトへ編集し直した。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
private GameObject mainCamera;//メインカメラ格納用
[SerializeField]
GameObject subCamera;
[SerializeField]
GameObject subCamera2;
public bool onsubc=false;
public bool onsubc2 = false;
void Start()
{
mainCamera = GameObject.Find("MainCamera");
//サブカメラ非アクティブ
subCamera.SetActive(false);
subCamera2.SetActive(false);
}
public void ChangeCamera()
{
if (onsubc2 == false)
{
mainCamera.SetActive(!mainCamera.activeSelf);
subCamera.SetActive(!subCamera.activeSelf);
onsubc = !onsubc;
}
}
public void ChangeCamera2()
{
if (onsubc == false)
{
mainCamera.SetActive(!mainCamera.activeSelf);
subCamera2.SetActive(!subCamera2.activeSelf);
onsubc2 = !onsubc2;
}
}
}
このカプセルはプレイヤーではなくドローンとして扱いたいので、プレイヤーオブジェクトと二つ目のドローンオブジェクトを作成する。
また、UIの表示管理で特定のプレイヤーの出現が確認できた場合のみ操作ボタンを表示できるようにする。
プレイヤーオブジェクトを追加し、二つ目のドローンオブジェクトを作成。ドローンはボタンが押されたタイミングで出現し、あとは存在し続けるものとする。
Droneをプレイヤーの子としているせいで、プレイヤーが動くと発現したドローンまで動いてしまう。なので最初は子要素としておき、ボタンが押されたタイミングで親オブジェクトからthis.transform.parent = null;で切り離す方法を試す。
if (cameraController.onsubc == true) {
if (this.transform.parent != null)
{
this.transform.parent = null;
}
このように対応し、実現できた。
UIの方もdroneplayerとして操作する場合に表示されるようにしたい。同期の際にphotonisMineなどで修正することになるが、現段階でもシーンにdronepalyerが存在する場合に現れることとしてコードを記載しておく。
下記コードをdroneplayerにアタッチし、UIを最初から非表示にしていれば、droneplayerがいる場合のみにUIが表示されるようになる。今回は自分のシーンのみだが、複数人が参加する場合は、このスクリプトでは全ての参加者のシーンに表示されてしまうので、photonisMineでdroneplayerのみにUI表示させる設定も以後必要になる。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DroneplayerUI : MonoBehaviour
{
[SerializeField]
GameObject droneUI;
// Start is called before the first frame update
void Start()
{
droneUI.SetActive(true);
}
}
//シーン上の明度を下げる
ある条件下でシーンを暗くなるようにしたいので、その機能を実装していく。
Unityシーンで暗闇を作るには、Directional Lightを消し、Skyboxからの光を遮断する必要があるとのことなのでスクリプトから、これらが操作できないか調べていく。
Directional LightのIntensityおよびSkyboxのReflection Intensityを操作できれば良さそう。
ただ、画面のUIでpanelの明度調整でも暗闇と同様の効果を生み出せるので、そちらがどのような見た目になるのかを先に確認する。
時間経過でシーン画面を暗くするスクリプトをpanelにアタッチし、ボタンを押すとpanelをactiveにし、暗闇のエフェクトを表示させるようにした。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class UIeffectdarker : MonoBehaviour
{
[SerializeField]
GameObject UIdark;
[SerializeField]
Darkeffect darkeffect;
public void UIDarkOn()
{
UIdark.SetActive(true);
}
public void UIDarkOff()
{
darkeffect.alfa = 0.7f;
UIdark.SetActive(false);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Darkeffect : MonoBehaviour
{
[SerializeField]
UIeffectdarker effectdarker;
public float speed = 0.1f; //透明化の速さ
public float alfa; //A値を操作するための変数
float timer;
void Start()
{
alfa = 0.7f;
}
void Update()
{
GetComponent<Image>().color = new Color(0, 0, 0, alfa);
timer += Time.deltaTime;
if (timer > 1)
{
alfa += speed;
timer = 0;
}
if (alfa >= 1)
{
effectdarker.UIDarkOff();
Debug.Log("a");
}
}
}
Panel操作だけでも案外大丈夫そう。