5.3背包系统(1)
基类脚本
usingUnityEngine;
usingSystem.Collections;
publicclassBaseScript{
publicintindex;
publicfloatattackValue;
publicfloatHp;
publicstringname;
publicstringdescription;
publicstringiconName;
publicBaseScript(intindex,floatattackValue,floatHp,stringname,stringdescription,stringiconName){
this.index=index;
this.attackValue=attackValue;
this.Hp=Hp;
this.name=name;
this.description=description;
this.iconName=iconName;
}
}
物品子类脚本
usingUnityEngine;
usingSystem.Collections;
//武器类
publicclassWeaponScript:BaseScript{
publicWeaponScript(intindex,floatattackValue,floatHp,stringname,stringdescription,stringiconName):base(index,attackValue,Hp,name,description,iconName){
}
}
添加物品脚本(挂载在canvas)
usingUnityEngine;
usingSystem.Collections;
usingSystem.Collections.Generic;
usingUnityEngine.UI;
publicclassAddGoodScript:MonoBehaviour{
publicGameObject[]cells;//所有存放装备的单元格
publicDictionaryItems=newDictionary();
voidStart(){
//测试代码
WeaponScriptdragon_Seord=newWeaponScript(1,20,10,"屠龙刀","屠龙一出,谁与争锋","m4");
ArmorsScriptSteelShield=newArmorsScript(2,0,20,"铁盾","一个盾牌","m7");
MagicScriptFireMagic=newMagicScript(3,30,0,"火焰药水","喝了可以释放火焰的药水","m3");
ConsumeScriptadd_Hp=newConsumeScript(4,0,40,"餐风饮露","药品","m1");
Items.Add(dragon_Seord.index,dragon_Seord);
Items.Add(SteelShield.index,SteelShield);
Items.Add(FireMagic.index,FireMagic);
Items.Add(add_Hp.index,add_Hp);
}
voidUpdate(){
if(Input.GetKeyDown(KeyCode.Space)){
intindex=Random.Range(1,5);//半闭半开(左闭右开)
PickUp(Items[index]);
}
}
voidPickUp(BaseScriptbaseScript){
//获取当前拾取/购买的装备应该存放在哪个单元格
for(int i=0;i<cells.Length;++i){
if(cells[i].transform.childCount>0){
//子物体不为空
//判断当前子物体是否和将要添加的子物体相同
//获取已经在这个单元格上的子物体
GameObject item=cells[i].transform.GetChild(0).gameObject;
if(baseScript.iconName==item.GetComponent<Image>( ).overrideSprite.name){
//将要添加的是和当前单元格相同的物体
//获取文本组件,更改数字
Text indexText=item.transform.GetChild(0).gameObject.GetComponent<Text>( );
int indexNumber=int.Parse(indexText.text);
++indexNumber;
indexText.text=indexNumber.ToString( );;
break;
}
}else if(cells[i].transform.childCount==0){
//当前子物体为空
//从Resources文件夹中加载预设体
GameObject itemPrefabs=Resources.Load("Item")as GameObject;
//使用预设体
GameObject item1
=Instantiate(itemPrefabs,cells[i].transform.position,cells[i].transform.rotation)asGameObject;
//获取预设体Image组件
Image image=item1.GetComponent<Image>( );
//设置图片
print(baseScript.iconName);
image.overrideSprite=Resources.Load("Texture/"+baseScript.iconName);
image.transform.SetParent(cells[i].transform);//设置父物体
image.transform.localPosition=Vector3.zero;//放到中心点
break;
}
}
}
}
使用物品脚本(挂载在canvas)
usingUnityEngine;
usingSystem.Collections;
usingUnityEngine.UI;
usingUnityEngine.EventSystems;
publicclassusing2:MonoBehaviour,IPointerClickHandler{
private GameObject item;
voidStart(){
}
voidUpdate(){
}
#regionIPointerClickHandlerimplementation
public void OnPointerClick(PointerEventData eventData)
{
if(eventData.button==PointerEventData.InputButton.Right){
//得到当前鼠标射线所检测到的游戏物体
item=eventData.pointerPressRaycast.gameObject;
if(item.name.Contains("Item")){
Text indexText=item.transform.GetChild(0).gameObject.GetComponent<Text>( );
int indexNumber=int.Parse(indexText.text);
--indexNumber;
if(indexNumber>0){
indexText.text=indexNumber.ToString( );
}
else{
Destroy(item);
UIManager.Instance.panel.SetActive(false);//物品消失后将描述信息隐藏
}
}
}
}
#endregion
}
拖拽物品移动脚本(挂载在canvas)
usingUnityEngine;
usingSystem.Collections;
usingUnityEngine.EventSystems;
usingUnityEngine.UI;
publicclassItemDragScript:MonoBehaviour,IDragHandler,IBeginDragHandler,IEndDragHandler{
public Transform lastImage;
private Transform itemTransform;//当前鼠标拖拽的物体的Transform
Transform startTransform;//开始时的父物体Transform
Transform endTransform;//结束时的父物体Transform
voidStart( ){
}
voidUpdate( ){
}
#regionIBeginDragHandlerimplementation
void IBeginDragHandler.OnBeginDrag(PointerEventData eventData)
{ //2
if(eventData.button==PointerEventData.InputButton.Left){
if(eventData.pointerCurrentRaycast.gameObject.name.Contains("Item")){ //1
itemTransform=eventData.pointerCurrentRaycast.gameObject.transform;
//让当前item在被拖动的时候不再遮挡射线的检测
itemTransform.GetComponent<CanvasGroup>( ).blocksRaycasts=false;
startTransform=itemTransform.parent;
itemTransform.parent=lastImage;
itemTransform.localScale=new Vector3(0.5f,0.5f,0);//拖拽途中物品缩放
} //1
else{
itemTransform=null;
}
} //2
else{
itemTransform=null;
}
}
#endregion
#regionIDragHandlerimplementation
void IDragHandler.OnDrag(PointerEventData eventData)
{
if(eventData.button==PointerEventData.InputButton.Left&&itemTransform){
itemTransform.position=Input.mousePosition;
}
}
#endregion
#regionIEndDragHandlerimplementation
void IEndDragHandler.OnEndDrag(PointerEventData eventData)
{
if(eventData.button==PointerEventData.InputButton.Left&&itemTransform){
if(eventData.pointerCurrentRaycast.gameObject.name.Contains("cell")){
//移动位置
//更改当前正在移动的item的父物体
if(eventData.pointerCurrentRaycast.gameObject.transform.childCount>0){
itemTransform.SetParent(startTransform);
itemTransform.localPosition=Vector3.zero;
}else{
itemTransform.SetParent(eventData.pointerCurrentRaycast.gameObject.transform);
itemTransform.localPosition=Vector3.zero;
}
}elseif(eventData.pointerCurrentRaycast.gameObject.name.Contains("Item")){
//交换
Transform otherItemTransform=eventData.pointerCurrentRaycast.gameObject.transform;
//获得将要交换物品栏中物品的数量
Text itemText=eventData.
pointerCurrentRaycast.gameObject.transform.GetChild(0).GetComponent
<Text>( );
int number_1=int.Parse(itemText.text);
//当前拖拽物品的数量
Text itemTransformText=itemTransform.GetChild(0).GetComponent
<Text>( );
intnumber_2=int.Parse(itemTransformText.text);
intsum=number_1+number_2;
//一个物品栏物品数量为30,小于30合并,大于30,一份30,一份sum-30
if(sum<=30){
itemTransformText.text=sum.ToString();
itemTransform.SetParent(otherItemTransform.parent);
Destroy(eventData.pointerCurrentRaycast.gameObject);
}else{
itemTransformText.text=30.ToString();
itemText.text=(sum-30).ToString();
}
//拖拽结束时,当前Item应该放置的位置
endTransform=otherItemTransform.parent;
//把当前正在拖拽的Item放到结束的位置
itemTransform.SetParent(endTransform);
itemTransform.localPosition=Vector3.zero;
//把结束拖拽时的cell上的Item放到所交换的Item的开始的cell上
otherItemTransform.SetParent(startTransform);
otherItemTransform.localPosition=Vector3.zero;
}else{
//返回原来的父物体
itemTransform.SetParent(startTransform);
itemTransform.localPosition=Vector3.zero;
}
////设置到cell的中心点
//itemTransform.localScale=Vector3.zero;
itemTransform.GetComponent<CanvasGroup>( ).blocksRaycasts=true;
itemTransform.localScale=new Vector3(1,1,0);
}
}
#endregion
}