code ソーシャル

Unityアプリcodetips(41)

スポンサーリンク

//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

 

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

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

3

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

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-code, ソーシャル
-,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.