需要在实例化对象中添加图片
Need to add image in the Instantiated object
我正在关注 youtube.This 上的教程,这是一个滑动菜单教程。
https://www.youtube.com/watch?v=njfc_QYKdio&t=229s
我尝试并了解他所做的事情。
public class SecMenuScene : MonoBehaviour {
[Range(1, 50)]
[Header("Controllers")]
public int panCount;
[Range(0, 500)]
public int panOffset;
[Range(0,20)]
public int snapSpeed;
[Range(0,6)]
public int scaleOffset;
[Range(0,20)]
public int scaleSpeed;
[Header ("Other object")]
public GameObject panPrefab;
public ScrollRect scrollRect;
private GameObject[] instPans;
private Vector2[] panPos,panScale;
private RectTransform contentRect;
private Vector2 contentVector;
public int selectedPanID;
public bool isScroling;
// Use this for initialization
void Start () {
contentRect = GetComponent<RectTransform>();
instPans = new GameObject[panCount];
panPos = new Vector2[panCount];
panScale = 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);
panPos[i] = -instPans[i].transform.localPosition;
}
}
// Update is called once per frame
void FixedUpdate () {
if(contentRect.anchoredPosition.x>= panPos[0].x && !isScroling || contentRect.anchoredPosition.x <= panPos[panPos.Length - 1].x && !isScroling)
{
scrollRect.inertia = false;
}
float nearestpos = float.MaxValue;
for (int i = 0; i < panCount; i++)
{
float distance =Mathf.Abs( contentRect.anchoredPosition.x - panPos[i].x);
if (distance < nearestpos)
{
nearestpos = distance;
selectedPanID = i;
}
float scale = Mathf.Clamp(1 / (distance / panOffset) * scaleOffset, 0.5f, 1);
panScale[i].x = Mathf.SmoothStep(instPans[i].transform.localScale.x+0.3f, scale, scaleSpeed * Time.fixedDeltaTime);
panScale[i].y = Mathf.SmoothStep(instPans[i].transform.localScale.y+0.3f, scale, scaleSpeed * Time.fixedDeltaTime);
instPans[i].transform.localScale = panScale[i];
}
float scrolVelocity = Mathf.Abs(scrollRect.velocity.x);
if (scrolVelocity < 400 && !isScroling) scrollRect.inertia = false;
if (isScroling || scrolVelocity>400) return;
contentVector.x = Mathf.SmoothStep(contentRect.anchoredPosition.x, panPos[selectedPanID].x, snapSpeed * Time.fixedDeltaTime);
contentRect.anchoredPosition = contentVector;
}
public void Scrolling(bool Scroll)
{
isScroling = Scroll;
if (Scroll) scrollRect.inertia = true;
}
}
但问题是现在我无法更改预制对象的图像。我尝试使用 SpriteRenderer 实例化 obj 并更改精灵。但无法找到解决方案。如果有人可以帮助或建议我应该阅读什么以使其正常工作。
谢谢你的帮忙。
看起来好像这些 UI 对象具有图像组件代替 SpriteRenderer。您需要获取此组件才能更改图像源。
例如
instPans[i].GetComponent<Image>().sprite = mySprite;
首先,您可以像声明的其他 public 变量一样保存对所需精灵的引用:
[Header ("Other object")]
public GameObject panPrefab;
public ScrollRect scrollRect;
[SerializeField]
private Sprite sprite; // or Sprite[] sprites if you need more than one
然后您可以在编辑器中向您的预制件添加一个图像组件,并按照您喜欢的方式设置其大小和位置。
for (int i = 0; i < panCount; i++)
{
instPans[i] = Instantiate(panPrefab, transform, false) ;
// you can get the reference to your Image component and set its sprite
Image im = instPans[i].GetComponent<Image>();
im.sprite = sprite; // or im.sprite = sprites[i] if you are using multiple sprites
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);
panPos[i] = -instPans[i].transform.localPosition;
}
我正在关注 youtube.This 上的教程,这是一个滑动菜单教程。 https://www.youtube.com/watch?v=njfc_QYKdio&t=229s 我尝试并了解他所做的事情。
public class SecMenuScene : MonoBehaviour {
[Range(1, 50)]
[Header("Controllers")]
public int panCount;
[Range(0, 500)]
public int panOffset;
[Range(0,20)]
public int snapSpeed;
[Range(0,6)]
public int scaleOffset;
[Range(0,20)]
public int scaleSpeed;
[Header ("Other object")]
public GameObject panPrefab;
public ScrollRect scrollRect;
private GameObject[] instPans;
private Vector2[] panPos,panScale;
private RectTransform contentRect;
private Vector2 contentVector;
public int selectedPanID;
public bool isScroling;
// Use this for initialization
void Start () {
contentRect = GetComponent<RectTransform>();
instPans = new GameObject[panCount];
panPos = new Vector2[panCount];
panScale = 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);
panPos[i] = -instPans[i].transform.localPosition;
}
}
// Update is called once per frame
void FixedUpdate () {
if(contentRect.anchoredPosition.x>= panPos[0].x && !isScroling || contentRect.anchoredPosition.x <= panPos[panPos.Length - 1].x && !isScroling)
{
scrollRect.inertia = false;
}
float nearestpos = float.MaxValue;
for (int i = 0; i < panCount; i++)
{
float distance =Mathf.Abs( contentRect.anchoredPosition.x - panPos[i].x);
if (distance < nearestpos)
{
nearestpos = distance;
selectedPanID = i;
}
float scale = Mathf.Clamp(1 / (distance / panOffset) * scaleOffset, 0.5f, 1);
panScale[i].x = Mathf.SmoothStep(instPans[i].transform.localScale.x+0.3f, scale, scaleSpeed * Time.fixedDeltaTime);
panScale[i].y = Mathf.SmoothStep(instPans[i].transform.localScale.y+0.3f, scale, scaleSpeed * Time.fixedDeltaTime);
instPans[i].transform.localScale = panScale[i];
}
float scrolVelocity = Mathf.Abs(scrollRect.velocity.x);
if (scrolVelocity < 400 && !isScroling) scrollRect.inertia = false;
if (isScroling || scrolVelocity>400) return;
contentVector.x = Mathf.SmoothStep(contentRect.anchoredPosition.x, panPos[selectedPanID].x, snapSpeed * Time.fixedDeltaTime);
contentRect.anchoredPosition = contentVector;
}
public void Scrolling(bool Scroll)
{
isScroling = Scroll;
if (Scroll) scrollRect.inertia = true;
}
}
但问题是现在我无法更改预制对象的图像。我尝试使用 SpriteRenderer 实例化 obj 并更改精灵。但无法找到解决方案。如果有人可以帮助或建议我应该阅读什么以使其正常工作。 谢谢你的帮忙。
看起来好像这些 UI 对象具有图像组件代替 SpriteRenderer。您需要获取此组件才能更改图像源。
例如
instPans[i].GetComponent<Image>().sprite = mySprite;
首先,您可以像声明的其他 public 变量一样保存对所需精灵的引用:
[Header ("Other object")]
public GameObject panPrefab;
public ScrollRect scrollRect;
[SerializeField]
private Sprite sprite; // or Sprite[] sprites if you need more than one
然后您可以在编辑器中向您的预制件添加一个图像组件,并按照您喜欢的方式设置其大小和位置。
for (int i = 0; i < panCount; i++)
{
instPans[i] = Instantiate(panPrefab, transform, false) ;
// you can get the reference to your Image component and set its sprite
Image im = instPans[i].GetComponent<Image>();
im.sprite = sprite; // or im.sprite = sprites[i] if you are using multiple sprites
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);
panPos[i] = -instPans[i].transform.localPosition;
}