「Unity/3d/画面奥スクロール」の版間の差分
提供: 初心者エンジニアの簡易メモ
| (同じ利用者による、間の10版が非表示) | |||
| 行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);
}
}
}
また今度
キャラに合わせて、背景側が、自動生成できるようにしたいかも
