「Unity/3d/画面奥スクロール」の版間の差分
提供: 初心者エンジニアの簡易メモ
(ページの作成:「==無限道路とは== 画面奥に進むように道が手前に流れる ==サンプル== 参考:https://gomafrontier.com/unity/2514」) |
|||
(同じ利用者による、間の11版が非表示) | |||
行1: | 行1: | ||
− | |||
− | |||
==サンプル== | ==サンプル== | ||
+ | 画面奥スクロールするように道が手前に流れる | ||
参考:https://gomafrontier.com/unity/2514 | 参考:https://gomafrontier.com/unity/2514 | ||
+ | |||
+ | 少し改良した。 | ||
+ | |||
+ | 使い方 | ||
+ | |||
+ | #画面上に"ScrollManager"というGameObjectを作る | ||
+ | #ScrollManagerのオブジェクトにScrollManager.csをドラッグして、プロパティのscrollBlockObjectに適当に"ScrollObject"をドラッグする | ||
+ | #画面上に"ScrollObjectStart"というオブジェクト開始点のGameObjectを作る | ||
+ | |||
+ | ScrollManager.cs | ||
+ | <pre> | ||
+ | using UnityEngine; | ||
+ | |||
+ | public class ScrollManager : MonoBehaviour | ||
+ | { | ||
+ | /// スクロール時の1ブロックとなるプレハブ | ||
+ | [SerializeField] | ||
+ | protected GameObject scrollBlockObject; | ||
+ | |||
+ | /// ブロックの生成開始位置 | ||
+ | [SerializeField] | ||
+ | protected Transform blockPopPoint; | ||
+ | |||
+ | /// ブロックの移動方向 | ||
+ | protected Vector3 blockMoveForward; | ||
+ | |||
+ | /// あらかじめブロックを生成しておく数 | ||
+ | protected int before_block_create_count = 20; | ||
+ | |||
+ | /// 最後の生成したブロックのRendererコンポーネント(処理用) | ||
+ | private Renderer beforeBlockRenderer; | ||
+ | |||
+ | void Start() | ||
+ | { | ||
+ | blockMoveForward = new Vector3(0, 0, -2f); | ||
+ | if (0 < before_block_create_count) | ||
+ | { | ||
+ | Bounds blockRendererBounds = scrollBlockObject.GetComponent<Renderer>().bounds; | ||
+ | blockRendererBounds.center = blockPopPoint.position; | ||
+ | |||
+ | for (int i = 0; i < before_block_create_count; i++) | ||
+ | { | ||
+ | Vector3 createPosition = blockPopPoint.position + new Vector3( | ||
+ | GetBinarizationFloat(blockMoveForward.x) * (blockRendererBounds.size.x * i), | ||
+ | GetBinarizationFloat(blockMoveForward.y) * (blockRendererBounds.size.y * i), | ||
+ | GetBinarizationFloat(blockMoveForward.z) * (blockRendererBounds.size.z * i) | ||
+ | ); | ||
+ | CreateBlock(createPosition); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | |||
+ | private void FixedUpdate() | ||
+ | { | ||
+ | if (beforeBlockRenderer != null) | ||
+ | { | ||
+ | Bounds beforeBounds = beforeBlockRenderer.bounds; | ||
+ | beforeBounds.size = beforeBlockRenderer.bounds.size * 2; | ||
+ | beforeBounds.center += blockMoveForward; | ||
+ | if (!beforeBounds.Contains(blockPopPoint.position)) | ||
+ | { | ||
+ | CreateBlock(blockPopPoint.position); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | private void CreateBlock(Vector3 createPosition) | ||
+ | { | ||
+ | GameObject blockObject = Instantiate(scrollBlockObject, createPosition, scrollBlockObject.transform.rotation); | ||
+ | |||
+ | blockObject.AddComponent<ScrollObject>().blockMoveForwardtranslate = blockMoveForward; | ||
+ | blockObject.GetComponent<ScrollObject>().delTime = 5f; | ||
+ | |||
+ | beforeBlockRenderer = blockObject.GetComponent<Renderer>(); | ||
+ | } | ||
+ | |||
+ | private float GetBinarizationFloat(float value) | ||
+ | { | ||
+ | if (0 < value) | ||
+ | { | ||
+ | return 1; | ||
+ | } | ||
+ | else if (value < 0) | ||
+ | { | ||
+ | return -1; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | return 0; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | ScrollObject.cs | ||
+ | <pre> | ||
+ | using UnityEngine; | ||
+ | |||
+ | public class ScrollObject : MonoBehaviour | ||
+ | { | ||
+ | public float delTime; | ||
+ | public Vector3 blockMoveForwardtranslate; | ||
+ | void Start() | ||
+ | { | ||
+ | Destroy(gameObject, delTime); | ||
+ | } | ||
+ | void Update() | ||
+ | { | ||
+ | if (blockMoveForwardtranslate != Vector3.zero) | ||
+ | { | ||
+ | transform.Translate(blockMoveForwardtranslate, Space.World); | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </pre> | ||
+ | |||
+ | ==また今度== | ||
+ | キャラに合わせて、背景側が、自動生成できるようにしたいかも | ||
+ | |||
+ | 参考:https://techblog.kayac.com/unity_advent_calendar_2018_04 |
2022年3月9日 (水) 00:16時点における最新版
サンプル
画面奥スクロールするように道が手前に流れる
参考:https://gomafrontier.com/unity/2514
少し改良した。
使い方
- 画面上に"ScrollManager"というGameObjectを作る
- ScrollManagerのオブジェクトにScrollManager.csをドラッグして、プロパティのscrollBlockObjectに適当に"ScrollObject"をドラッグする
- 画面上に"ScrollObjectStart"というオブジェクト開始点のGameObjectを作る
ScrollManager.cs
using UnityEngine; public class ScrollManager : MonoBehaviour { /// スクロール時の1ブロックとなるプレハブ [SerializeField] protected GameObject scrollBlockObject; /// ブロックの生成開始位置 [SerializeField] protected Transform blockPopPoint; /// ブロックの移動方向 protected Vector3 blockMoveForward; /// あらかじめブロックを生成しておく数 protected int before_block_create_count = 20; /// 最後の生成したブロックのRendererコンポーネント(処理用) private Renderer beforeBlockRenderer; void Start() { blockMoveForward = new Vector3(0, 0, -2f); if (0 < before_block_create_count) { Bounds blockRendererBounds = scrollBlockObject.GetComponent<Renderer>().bounds; blockRendererBounds.center = blockPopPoint.position; for (int i = 0; i < before_block_create_count; i++) { Vector3 createPosition = blockPopPoint.position + new Vector3( GetBinarizationFloat(blockMoveForward.x) * (blockRendererBounds.size.x * i), GetBinarizationFloat(blockMoveForward.y) * (blockRendererBounds.size.y * i), GetBinarizationFloat(blockMoveForward.z) * (blockRendererBounds.size.z * i) ); CreateBlock(createPosition); } } } private void FixedUpdate() { if (beforeBlockRenderer != null) { Bounds beforeBounds = beforeBlockRenderer.bounds; beforeBounds.size = beforeBlockRenderer.bounds.size * 2; beforeBounds.center += blockMoveForward; if (!beforeBounds.Contains(blockPopPoint.position)) { CreateBlock(blockPopPoint.position); } } } private void CreateBlock(Vector3 createPosition) { GameObject blockObject = Instantiate(scrollBlockObject, createPosition, scrollBlockObject.transform.rotation); blockObject.AddComponent<ScrollObject>().blockMoveForwardtranslate = blockMoveForward; blockObject.GetComponent<ScrollObject>().delTime = 5f; beforeBlockRenderer = blockObject.GetComponent<Renderer>(); } private float GetBinarizationFloat(float value) { if (0 < value) { return 1; } else if (value < 0) { return -1; } else { return 0; } } }
ScrollObject.cs
using UnityEngine; public class ScrollObject : MonoBehaviour { public float delTime; public Vector3 blockMoveForwardtranslate; void Start() { Destroy(gameObject, delTime); } void Update() { if (blockMoveForwardtranslate != Vector3.zero) { transform.Translate(blockMoveForwardtranslate, Space.World); } } }
また今度
キャラに合わせて、背景側が、自動生成できるようにしたいかも