//tips
//パーティクル内容を2D画像に変換
パーティクルは発生装置を残したまま拡散内容を2D画像に変更することが可能である。
パーティクルに2D画像をそのままアタッチすることはできないので、まずはmaterialをプロジェクトビューから作成し、Albedoに画像をアタッチ、Shaderの内容をParticle→Alpha Blendedに変更。(表示がなければ下部にあるlegacy shaderdsから選択)
最後にパーティクルのrendererのmaterialに作成したmaterialをアタッチ。
//camera方向をマウス座標の変化で回転させる
Camraの視点をプレイヤーが自由に動かしてみる。
Cameraに下記2種のスクリプトを付加する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NewCamera : MonoBehaviour
{
[SerializeField]
private float x_sensitivity = 3f;
void Update()
{
float x_mouse = Input.GetAxis("Mouse X");
Vector3 newRotation = transform.localEulerAngles;
newRotation.y += x_mouse * x_sensitivity;
transform.localEulerAngles = newRotation;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class YNewCamera : MonoBehaviour
{
[SerializeField]
private float y_sensitivity = 3f;
void Update()
{
float y_mouse = Input.GetAxis("Mouse Y");
Vector3 newRotation = transform.localEulerAngles;
newRotation.x -= y_mouse * y_sensitivity;
transform.localEulerAngles = newRotation;
}
}
//カメラの操作切り替えについて
以前のカメラの切り替えスクリプトがエラーになってしまったが、その要因がHierarchy内の全オブジェクトを検索して指定したGameObjectを見つけ出すGameObject.Findにあり、指定したGameObjectが非アクティブだった場合には、取得することができずnullが返されエラーとなることがわかった。
また、if(B.SetActive(true))のようなsetactiveの状態で分岐させることはできないため、シーン中のGameObjectが有効かどうかを取得できるプロパティであるGameObject.activeSelfを用いる。
bool型なので偽の場合を表す!を使うことができ、!mainCam.activeSelfとすることでメインカメラがアクティブでない場合mainCam.SetActive(!mainCam.activeSelf)にtrueを返すように設定できる。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController3 : MonoBehaviour
{
public GameObject mainCam;
public GameObject subCam;
void Start()
{
mainCam.SetActive(true);
subCam.SetActive(false);
}
void Update()
{
if (Input.anyKey)
{
mainCam.SetActive(!mainCam.activeSelf);
subCam.SetActive(!subCam.activeSelf);
}
}
}
//ボタンを作成し、カメラの切り替え機能を付与
カメラの切り替えスクリプトができたので、それをボタンを押したら切り替えを実行できるようにする。
ボタンに対してeventtriggerコンポーネントを追加し、pointerdown設定でカメラの切り替えスクリプトを保有しているオブジェクトをアタッチし、その中からボタンように追加したpublic void Pushsky()などを選択する。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController3 : MonoBehaviour
{
public GameObject mainCam;
public GameObject subCam;
void Start()
{
mainCam.SetActive(true);
subCam.SetActive(false);
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
mainCam.SetActive(!mainCam.activeSelf);
subCam.SetActive(!subCam.activeSelf);
}
}
public void Pushsky()
{
mainCam.SetActive(!mainCam.activeSelf);
subCam.SetActive(!subCam.activeSelf);
}
}
さらに、そのsubcameraに対してx軸のマウスの動きを追尾するスクリプトを追加すると、通常カメラと操作可能カメラを作成することができる。
//unityでのスティック操作の実装
カメラの操作をボタンとは別にスティックで操作させるためにスティック操作の導入を検討した。
スティックなのでInput.GetAxisメソッドの設定で考える。
キーボド入力を使用した簡単なGetAxisの移動を青丸のimage画像にさせてみる。
使用するのは矢印キーのみ。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Getaxis : MonoBehaviour
{
void Update()
{
float dx = Input.GetAxis("Horizontal");
float dy = Input.GetAxis("Vertical");
transform.Translate(dx, dy, 0.0F);
}
}
この動きを元にこれから下記スクリプトを分解する。
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class CameraStick : Graphic, IEndDragHandler, IDragHandler, IPointerDownHandler, IPointerUpHandler
{
public Transform padObjectTransform;
private float padMovableRadius = 100;
private static Vector2 axis = Vector2.zero;
public static float GetAxisHorizontal()
{
return axis.x;
}
public static float GetAxisVertical()
{
return axis.y;
}
protected override void Awake()
{
base.Awake();
Image padImage = padObjectTransform.GetComponent<Image>();
padImage.raycastTarget = false;
raycastTarget = true;
}
public void OnPointerDown(PointerEventData eventData)
{
OnDrag(eventData);
}
public void OnPointerUp(PointerEventData eventData)
{
OnEndDrag(eventData);
}
public void OnDrag(PointerEventData eventData)
{
//CanvasがScreen Space - Overlayの場合のみ//
Vector2 tapPosition = transform.InverseTransformPoint(eventData.position);
//CanvasがScreen Space - Cameraなら、たぶんこう//
//Vector2 tapPosition = Vector2.zero;
//RectTransformUtility.ScreenPointToLocalPointInRectangle(this.rectTransform, eventData.position, null, out tapPosition);
//タップ位置の半径が指定半径より長かったら修正//
if (Vector3.Distance(Vector3.zero, tapPosition) > padMovableRadius)
{
tapPosition = GetRadiusLimitedPosition(tapPosition, padMovableRadius);
}
SetPadObjectPosition(tapPosition);
}
//指定半径に収めた座標を返す//
private Vector2 GetRadiusLimitedPosition(Vector2 tapPosition, float radius)
{
float radian = Mathf.Atan2(tapPosition.y, tapPosition.x);
Vector2 limitedPosition = Vector2.zero;
limitedPosition.x = radius * Mathf.Cos(radian);
limitedPosition.y = radius * Mathf.Sin(radian);
return limitedPosition;
}
//JoyStickのPad位置を設定//
public void SetPadObjectPosition(Vector3 position)
{
padObjectTransform.localPosition = position;
axis = new Vector2(
padObjectTransform.localPosition.x / padMovableRadius,
padObjectTransform.localPosition.y / padMovableRadius
);
}
public void OnEndDrag(PointerEventData eventData)
{
SetPadObjectPosition(Vector3.zero);
}
}
//staticの活用方法
Staticで示される値は、クラスが直接管理する一つしか存在しない値である。
他の変数などはオブジェクトごとに値を設定することができるため、他のスクリプトで使用するためには、publicやGetComponentを用いて取得する必要がある。
しかし、Staticで示される値はクラス唯一のものであるためクラス名.変数名で簡単にアクセスすることができる。
例えば、
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static void AddScore(int point){
score += point;
}
と書かれたスクリプトのscoreを他のスクリプトで編集する時には、下記のような形ですむ。
sing System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Example : MonoBehaviour {
void Start () {
Score.score = 10;
Score.AddScore (12);
Debug.Log (Score.score);
}
}
//スクリプトのクラス:の後に続くEventsystemの活用
スクリプトのクラス:の後に続くIEndDragHandler, IDragHandler, IPointerDownHandler, IPointerUpHandlerについて。
これらを使う際にはusing UnityEngine.EventSystems;を宣言する必要がある。
下記のようにeventの情報を簡易的に得て、eventに対する処理を作成することが可能となる。
IEndDragHandler - OnEndDrag - ドラッグが終了したときドラッグ対象オブジェクトで呼び出される。
IDragHandler - OnDrag - ドラッグ対象がドラッグされている間呼び出される。
IPointerDownHandler - OnPointerDown - ポインターがオブジェクトを押下したときに呼び出さる。
IPointerUpHandler - OnPointerUp - ポインターを離したときに呼び出される。(ポインターが押下されているオブジェクト上で呼び出される)
サポートされているイベントは下記参照。
https://docs.unity3d.com/ja/2018.4/Manual/SupportedEvents.html
https://gist.github.com/TakaakiIchijo/018b3e1a90abaab32adc7703519ca780
https://qiita.com/RyotaMurohoshi/items/7868752a3f056affa2df
https://westhillapps.blog.jp/archives/42939064.html
https://answers.unity.com/questions/1652661/onpointerdown-and-onpointerup-doesnt-work.html
https://docs.unity3d.com/ja/2018.4/ScriptReference/EventSystems.IPointerDownHandler.html