「Unity/3d/画面奥スクロール」の版間の差分
提供: 初心者エンジニアの簡易メモ
(同じ利用者による、間の7版が非表示) | |||
行5: | 行5: | ||
参考:https://gomafrontier.com/unity/2514 | 参考:https://gomafrontier.com/unity/2514 | ||
− | + | 少し改良した。 | |
+ | |||
+ | 使い方 | ||
+ | |||
+ | #画面上に"ScrollManager"というGameObjectを作る | ||
+ | #ScrollManagerのオブジェクトにScrollManager.csをドラッグして、プロパティのscrollBlockObjectに適当に"ScrollObject"をドラッグする | ||
+ | #画面上に"ScrollObjectStart"というオブジェクト開始点のGameObjectを作る | ||
+ | |||
+ | ScrollManager.cs | ||
<pre> | <pre> | ||
using UnityEngine; | using UnityEngine; | ||
− | public class | + | public class ScrollManager : MonoBehaviour |
{ | { | ||
/// スクロール時の1ブロックとなるプレハブ | /// スクロール時の1ブロックとなるプレハブ | ||
行67: | 行75: | ||
GameObject blockObject = Instantiate(scrollBlockObject, createPosition, scrollBlockObject.transform.rotation); | GameObject blockObject = Instantiate(scrollBlockObject, createPosition, scrollBlockObject.transform.rotation); | ||
− | blockObject.AddComponent< | + | blockObject.AddComponent<ScrollObject>().blockMoveForwardtranslate = blockMoveForward; |
− | blockObject.GetComponent< | + | blockObject.GetComponent<ScrollObject>().delTime = 5f; |
beforeBlockRenderer = blockObject.GetComponent<Renderer>(); | beforeBlockRenderer = blockObject.GetComponent<Renderer>(); | ||
行90: | 行98: | ||
} | } | ||
</pre> | </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); } } }
また今度
キャラに合わせて、背景側が、自動生成できるようにしたいかも