Answer the question
In order to leave comments, you need to log in
How can one prefab be used for many functions?
Tell me how you can implement many functions using one prefab.
For example, there is a scrolling menu where you need to select several scenes and navigate through them.
Script I am using:
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class SnapScrolling : MonoBehaviour
{
[Range(1, 10)]
[Header("Content")]
public int panCount;
[Range(0, 100)]
public int panOffset;
[Range(0f, 10f)]
public float snapSpeed;
[Range(0f, 10f)]
public float scaleOffset;
[Range(1f, 10f)]
public float scaleSpeed;
[Header("other")]
public GameObject panPrefab;
public ScrollRect scrollRect;
public RectTransform prefarb;
public Button countButtont;
private GameObject[] instPans;
private Vector2[] pansPos;
private Vector2[] pansScale;
private RectTransform contentRect;
private Vector2 contentVector;
private int selectedPanID;
private bool isScrolling;
private void Start()
{
contentRect = GetComponent<RectTransform>();
instPans = new GameObject[panCount];
pansPos = new Vector2[panCount];
pansScale = new Vector2[panCount];
for (int i = 0; i < panCount; i++)
{
instPans[i] = Instantiate(panPrefab, transform, false);
if (i == 0) continue;
instPans[i].transform.localPosition = new Vector2(instPans[i - 1].transform.localPosition.x + panPrefab.GetComponent<RectTransform>().sizeDelta.x + panOffset,
instPans[i].transform.localPosition.y);
pansPos[i] = -instPans[i].transform.localPosition;
}
}
private void FixedUpdate()
{
if (contentRect.anchoredPosition.x >= pansPos[0].x && !isScrolling || contentRect.anchoredPosition.x <= pansPos[pansPos.Length - 1].x && !isScrolling)
scrollRect.inertia = false;
float nearestPos = float.MaxValue;
for (int i = 0; i < panCount; i++)
{
float distance = Mathf.Abs(contentRect.anchoredPosition.x - pansPos[i].x);
if (distance < nearestPos)
{
nearestPos = distance;
selectedPanID = i;
}
float scale = Mathf.Clamp(1 / (distance / panOffset) * scaleOffset, 0.5f, 1f);
pansScale[i].x = Mathf.SmoothStep(instPans[i].transform.localScale.x, scale + 0.3f, scaleSpeed * Time.fixedDeltaTime);
pansScale[i].y = Mathf.SmoothStep(instPans[i].transform.localScale.y, scale + 0.3f, scaleSpeed * Time.fixedDeltaTime);
instPans[i].transform.localScale = pansScale[i];
}
float scrollVelocity = Mathf.Abs(scrollRect.velocity.x);
if (scrollVelocity < 400 && !isScrolling) scrollRect.inertia = false;
if (isScrolling || scrollVelocity > 400) return;
contentVector.x = Mathf.SmoothStep(contentRect.anchoredPosition.x, pansPos[selectedPanID].x, snapSpeed * Time.fixedDeltaTime);
contentRect.anchoredPosition = contentVector;
}
public void Scrolling(bool scroll)
{
isScrolling = scroll;
if (scroll) scrollRect.inertia = true;
}
}
Answer the question
In order to leave comments, you need to log in
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question