unityscrollview生成大量_UnityEngine实现滚动例子(ScrollView)

本文档提供了一个使用Unity3D创建ScrollView并动态生成大量项目的示例。核心代码展示了如何初始化和更新ScrollView,包括设置Rect对象、创建子对象、设置数据以及处理鼠标输入进行滚动操作。
摘要由CSDN通过智能技术生成

【实例简介】

【实例截图】

【核心代码】

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

public class SelfScrollView : MonoBehaviour, ISelfScrollView

{

public SelfScrollDirectionTypeEnum directionTypeEnum = SelfScrollDirectionTypeEnum.Vertical;

public int MaxItemCount;

public SelfScrollItem ScrollItem;

public float YOffset;

public List DataList;

public string Response;

public List itemList;

private bool mousePress;

private Vector3 mousePosition;

private Vector3 offsetPosition;

private SelfScrollViewManager selfScrollViewManager;

void Awake()

{

this.AwakeBeforeHandler ();

this.AwakeHandler ();

this.AwakeAfterHandler ();

}

protected virtual void AwakeBeforeHandler() {}

protected virtual void AwakeHandler()

{

if(this.itemList == null) this.itemList = new List();

// 设置 RECT 对象

Rect viewRect = this.GetViewRect ();

// 设置 ITEM RECT 对象

Rect itemRect = this.GetItemRect ();

// 初始化滚动管理

this.selfScrollViewManager = new SelfScrollViewManager (viewRect, itemRect, this.YOffset);

// 初始化引用

GameObject newGameObjectReference = null;

// 初始化元件

SelfScrollItem selfScrollItem = null;

// 设置 Y 偏移

float yOffset = viewRect.y - itemRect.y;

// 初始化子对象

for(int index = 0; index < this.MaxItemCount; index )

{

newGameObjectReference = GameObject.Instantiate(this.ScrollItem.GetTransform().gameObject) as GameObject;

if(newGameObjectReference != null)

{

newGameObjectReference.transform.parent = this.transform;

newGameObjectReference.transform.localScale = Vector3.one;

newGameObjectReference.transform.localPosition = new Vector3(0f, yOffset, 0f);

selfScrollItem = newGameObjectReference.GetComponent();

if(selfScrollItem != null)

{

yOffset -= (itemRect.y - itemRect.height this.YOffset);

newGameObjectReference.SetActive(true);

selfScrollItem.SetIndex(index);

this.itemList.Add(selfScrollItem);

selfScrollItem.SetData(this.DataList[index]);

}

else

{

newGameObjectReference.SetActive(false);

}

}

}

}

protected virtual void AwakeAfterHandler() {}

///

/// 裁剪范围

///

/// The view rect.

public virtual Rect GetViewRect () { return new Rect (150, 150, -150, -150); }

///

/// ITEM 裁剪区域

///

/// The item rect.

public virtual Rect GetItemRect() { return new Rect(-150, 50, 150, -50); }

void Update()

{

this.UpdateBeforeHandler ();

this.UpdateHandler ();

this.UpdateAfterHandler ();

}

protected virtual void UpdateBeforeHandler() {}

private SelfScrollView selfScrollView;

protected virtual void UpdateHandler()

{

if(!string.IsNullOrEmpty(this.Response))

{

if(UICamera.hoveredObject != null)

{

this.selfScrollView = UICamera.hoveredObject.GetComponent();

if(this.selfScrollView == null) return;

// 如果感觉数据不正确

if(this.Response != this.selfScrollView.Response)

{

this.mousePress = false;

return;

}

}else

{

this.mousePress = false;

return;

}

}

// 如果左键按下

if(Input.GetMouseButtonDown(0))

{

this.mousePosition = Input.mousePosition;

this.mousePress = true;

}

if(Input.GetMouseButtonUp(0))

{

this.mousePress = false;

}

if(this.mousePress)

{

this.offsetPosition = Input.mousePosition - this.mousePosition;

this.mousePosition = Input.mousePosition;

if(directionTypeEnum == SelfScrollDirectionTypeEnum.Vertical)

{

this.VerticalScrollProgress(this.offsetPosition.y);

}

}

}

protected virtual void UpdateAfterHandler() {}

protected virtual void VerticalScrollProgress(float offset)

{

this.selfScrollViewManager.VerticalOperater(offset, this.itemList, this.DataList.Count, this.ItemCallback);

}

protected virtual void ItemCallback(ISelfScrollItem scrollItem)

{

int index = scrollItem.GetIndex ();

if(index < 0 || index >= this.DataList.Count) return;

((SelfScrollItem)scrollItem).SetData(this.DataList[index]);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值