자료 구조를 말씀하시는 건가요?
보통 사이즈가 정해져 있는 인벤 같은 경우에는 배열로 하고,
유동적으로 늘어나는 것은 맵 같은 자료를 많이 써요.
아무래도 인벤토리의 아이템들은 서치도 빈번하게 일어나니까요.
또 인덱스 위치랑 바로 매칭이 되고요.
저도 기존에 온라인 rpg 유지보수 일 하면서 소소를 많이 봤는데 대부분 이런식으로 하더라구요.
그리고 이번에 직접 플젝에 인벤을 구현했는데 직접 손으로 만들어보니까 생각보다
신경 써야 할 부분들이 많더라구요.
인벤토리 한 칸에 들어가야 할 정보들... 즉, 아이템 하나가 가지는 속성들을 잘 생각하셔서
구조체로 만들고 이것들을 관리하는 자료구조를 잘 적용하고 설계하는 것을 주 목표로 잡으시면 될 것 같네요
일단 첨부하신건 보지 않았습니다.
아이템에 수량이 존재한다면 다음처럼 풀 수 있을 것입니다.
저는 c#으로 짜기때문에 c#으로 작성해보겠습니다.
갯수를 가진 아이템 넣고 빼는 것중에서 가장 심플한 형태라고 생각합니다.
이 재료로 이제 알아서 뿌려주시면 됩니다.
UI와 연결하는것이나 아이템을 저장&불러오는 것은 본인의 재량으로...
저 컴포넌트를 가진 게임오브젝트를 인벤토리로 만드시고
OnGUI 함수 만드셔서 직접 뿌려줘도 될 것입니다.
Stacking Items in a Inventory List
I have my inventory script, an enemy script with item dropping and looting, and an Item Class script all in Java. It all works fine, but I'm trying to find a way to make Items stackable. I have added a stackable boolean to my items and set them to true as well as a stack limit and amount variable. What I don't understand is how, when a button is clicked, can I search through a list for that item, if it exists change a varialble on that item. That is my only problem with this script right now. Here are those scripts(one being just a snippet). My Item Class. My Enemy my inventory class And the snippet that deals with the inventory in my levelmanager script. I'm not looking for a system all coded out, or I would have already done that. I like the way my system works, and the fact I made it. this is the first time I've come to the answers community and I hope I can learn something here. Any help would be appreciated :) |
Well there are some things i would change ;) First the boolean is redundant. Since you have a MaxStack variable you can simply set it to 0 or -1 for items that aren't stackable. Next thing is how can you tell that two items are of the same type? ItemID? Name? You have to specify a criteria which you can use to identify similar items. I would probably create a filter function. Something like that: Note: I just wrote / modified that here on UA so there might be some syntax errors ;) I just compared the ItemID in this case. Maybe you want something else?! |
Take a look, maybe you can do something like this(C# Code): (Tested) |
The code is like http://www.burgzergarcade.com/. Thanks to his tutorials i was able to start a game. I have been modifying and changing so it can become my own game. i would really like to be able to stack items, since my inventory will have infinity items. I am not sure how to start with the code to check if item is same vs quantity vs stack number.
- public class Item
- {
- public int itemID;
- public string name = "";
- public int level;
- public bool stackable = true;
- public int quantity = 1;
- public int maxQuantity = 99;
- public int stack = 1;
- public int maxStack = 5;
- public int attack;
- public int physicalDefense;
- public int charges;
- public int cost;
- public string description = "";
- public Texture2D icon;
- }
-
- public static class ItemGenerator
- {
-
- public static Weapon AddMeleeWeapon(ItemsNames meleeWeaponName, int quantity)
- {
- Weapon meleeWeapon = new Weapon();
-
- switch(meleeWeaponName)
- {
- case ItemsNames.Sword:
- meleeWeapon.itemID = 1;
- meleeWeapon.name = "Sword";
- meleeWeapon.level = 1;
- meleeWeapon.stackable = true;
- meleeWeapon.quantity = quantity;
- meleeWeapon.maxQuantity = 99;
- meleeWeapon.stack = 1;
- meleeWeapon.maxStack = 5;
- meleeWeapon.attack = 10;
- meleeWeapon.cost = 5;
- meleeWeapon.description = "Iron Sword";
- break;
- default:
- break;
- }
-
- meleeWeapon.icon = Resources.Load( "Item/Icon/Weapon/Melee/" + "Sword" ) as Texture2D;
-
- return meleeWeapon;
- }
- }
-
- public class Chest : MonoBehaviour
- {
- public List<Item> loot = new List<Item>();
-
- void Start()
- {
- loot.Add(ItemGenerator.AddMeleeWeapon( ItemsNames.Sword ));
- loot.Add(ItemGenerator.AddMeleeWeapon( ItemsNames.Sword ));
- loot.Add(ItemGenerator.AddMeleeWeapon( ItemsNames.Sword ));
- loot.Add(ItemGenerator.AddMeleeWeapon( ItemsNames.Sword ));
- }
- }
-
- public class PC : BaseCharacter(MonoBehavior)
- {
- private List<Item> inventory = new List<Item>();
-
- public List<Item> Inventory
- {
- get { return inventory; }
- set { inventory = value; }
- }
- }
-
- public class MyGUI : MonoBehaviour
- {
-
- private void LootWindow(int id)
- {
-
- for(int cnt = 0; cnt < chest.loot.Count; cnt++)
- {
- if(GUI.Button(new Rect(5 +(50 * cnt), 10, 50, 50), new GUIContent(chest.loot[cnt].icon)))
- {
- PC.Instance.Inventory.Add(chest.loot[cnt]);
- chest.loot.RemoveAt(cnt);
- }
- }
- }
-
- public void InventoryWindow(int id)
- {
- int cnt = 0;
-
- for(int y = 0; y < 15; y++)
- {
- for(int x = 0; x < 10; x++)
- {
- if(cnt < PC.Instance.Inventory.Count)
- {
- if(GUI.Button(new Rect(5 + ( x * buttonWidth ), 20 + (y * 50), 50, 50), new GUIContent(PC.Instance.Inventory[cnt].icon)))
- {
- }
- }
- else
- {
- GUI.Button(new Rect(10 + x * 50, 25 + y * 50, 50, 50), "");
- }
-
- cnt++;
- }
- }
- }
- }
This is Trimmed down to explain what i have.
'유니티 > Note' 카테고리의 다른 글
| 유니티 퀘스트 관련 (0) | 2014.04.10 |
|---|---|
| 유니티 스크립트 호출 순서 제어 (0) | 2014.04.09 |
| 유니티 인벤토리 관련 구현 (0) | 2014.04.07 |
| delegate, action, event 활용 관련 (0) | 2014.04.07 |
| 안드로이드 In-app Billing Version 3 - 구글번역 (0) | 2014.03.27 |
| 파이어 폭스 유용한 부가기능 (0) | 2014.02.24 |
음.. 저도 처음에 .net freamwork generic관련 함수들을 만났때 이해하기 상당히 어려웠던기억이....
검색을 하거나 외부 플러그인 소스를 살펴보면
delegate, action, event가 자주 눈에 띄는데, <- 이부분을 직접 분석해가면서 공부했던게 큰도움이 되었습니다.
아주간략하게 예를 원하시면.
event의경우 delegate를 담을 그릇으로 보시면되고
delegate의경우 method를 담는그릇으로 보시면 됩니다. 머 c++의 함수포인터와 거의 비슷한놈이라 보시면 됩니다.
만약에 게임전체에서 사용될 POPUP(YES , NO버튼을 가진)에서 사용될 popup class를 구현할시
public class Popup : Pannel{
public delegate void PopUpEvent(); // void 타입 delegate 선억
public event PopUpEvent ClickYes; // yes클릭시 실행할 event선언
public event PopUpEvent ClickNo; // no클릭시 실행할 event선언
public void ClickYes(){ ClickYes(); }
public void ClickNo(){ ClickNo(); }
}
이런식으로 구현을 해두면 추후에 popup을 활용히 void()타입의 method는 뭐든지 (yes/no버튼의)
콜백 이벤트로 사용할수 있습니다.
public void testEvent(){
// yes 버튼 눌렸을때 실행
}
이런식의 void 형 method를 콜백으로 지정해주고싶으시면
ClickYes += testEvent; 이런식으로 담을수있습니다.
ClickYes -= testEvent; 이런식으로 뺄수도 있구요 ^^
Class 1
public delegate void DelegateResultCallback(bool flag);
DelegateResultCallback _delegateCallback;
//콜백 등록
public void SetCallBack(DelegateResultCallback callback)
{
if (_delegateCallback == null)
{
_delegateCallback = callback;
}
}
Class 2
Class1.SetCallBack(new Class1.DelegateResultCallback(OnResult));
//콜백 리턴 함수 구현
void OnResult(bool flag)
{
}
delegate는 쓰기 나름이지만 대체적으로 게임에서는 이벤트 처리에서 많이 쓰입니다. 예를들어 플레이어를 어떤 몹이 공격을 합니다. 단순히 체력만 깍는 문제면 monster.attack(player) 같은 함수를 만들어 쓰면 되지만 몹이 공격에 대한 반응이 체력도 깍이면서 상태 이상도 일으켜야 되고 넉백도 되면서... 등등 요구에따라 계속 반응이 늘어갈 경우 매 함수를 다 만드는것 보단 딜리게이트를 플레이어에 선언하고 다음과 같이 씁니다.
public delegate void MobInteraction(interaction_type type);
public MobInteraction mobinteractions;
몹이 타격시 player.mobinteractions(짱쌘공격);
이후 새로운 처리가 필요 할때 마다 이런 식으로 추가만 해주면 되어 확정성이 좋아 집니다.
동적으로 처리를 빼고 끼고 할 수있어서 재미있는 반응을 게임상에서 만들 수도 있죠..(특정 트리거에가면 저주가 발동해서 저주 반응 처리기를 추가하는 등)
void KnockBackProcesser(interaction_type type)
{
if(type == 짱쌘공격)
{
//넉백처리
}
}
player.mobinteractions += KnockBackProcesser;
음.. 제대로 설명할 자신은 별로 없지만..
delegate(event도 연관되죠..)는 C++에서 CallBack 함수하고 같은 기능을 합니다.
[실생활에서 delegate와 비슷한 상황을 말한다면..]
1) 손님이 카페에 갑니다.
2) 손님이 카페에서 주문을 합니다.
3) 손님이 주문하면 점원은 결재를 하고 원격으로 call 하는 기계(이름 몰라요..;;)를 손님에게 줍니다.
기계안에 delegate로 호출 event를 등록 하고 줬습니다.
4) 카페에서는 누가 주문을 했는지는 모르고 주문번호(기계에 붙은 번호)와 들어온 걸 만듭니다.
5) 점원이 주문한 내용을 다 만들고 나면, 주문자가 누군지는 모르지만 주문번호의 기계를 호출(call) 합니다.
6) 손님은 누가만들었는지는 몰라도 기계가 울리니깐 카운터로 가서 주문한 음료를 받아서 돌아갑니다.
[게임에서라면..]
간단하게 GameManager와 Player가 있다고 하겠습니다.
Player가 죽는 경우의 처리에 대해서 어떻게 처리할 것인가..만 간단히 생각해 보겠습니다.
예를 드는거라 두가지만 간단하게 극단적으로 말하자면..
1) GameManager의 Update에서 Player의 HP를 항상 체크하면서, 혹은 죽었는지를 항상 체크하면서 죽으면 어떤 처리를 하는 방식.(매 Update 주기마다 호출함)
2) GameManager가 Player에게 delegate로 Dead event를 넘겨줍니다. 그 후에 Player 자신이 죽었을 때 Dead event를 발생(1회 호출함)시켜서 GameManager에게 죽었다고 알립니다.
delegate-event를 사용하면, 위에서 보시다시피 2)번이 호출 횟수도 적고 로직상 연관성이나 상하관계를 안가지더라도 무언가 이벤트가 일어났을 때 알려줄 수 있습니다.
좀 극단적인 비교였습니다만..
대충 이럴 때 사용하는구나..라고 생각하심이.. =_=
P.s. 더 자세한 설명은 아랫 분이 해주실거에요. (..)
델리게이트는 보통이벤트핸들링, 리스닝(통칭 이벤트 핸들링이라 하겠습니다)을 위해서 씁니다.
이벤트핸들링에는 대충 몇가지 의미가 있는데, 크게 보면 모두 다 피동적인 액션을 취할때 사용합니다.
누군가가 나를 호출하므로서 내가 호출당하기 위해 사건에 개입하는 일이 없게됩니다.
즉, 사건과 그로인한 행위를 분리할 수 있는것입니다.
더욱이 델리게이트는 C++에서 이 이벤트핸들링을 위해서 사용하던 함수포인터라는 개념을 더더욱 쓰기좋게 만들어둔 형태로
여러가지 확장기능이나 편의기능이 제공됩니다.
몇가지 예를 들어드리면 다음과 같습니다.
버튼을 누르면 월드내 생성되는 오브젝트 전체가 죽는다고 가정합시다.
이걸 이벤트핸들링 없이 처리하면, 버튼이 눌렸을 시점을 IF문등으로 체크하여
모든 오브젝트를 돌며 죽는 처리를 해야할 것입니다.
foreach(WorldInObject obj in ..)
obj.die();
그러나 델리게이트를 사용하면, 이것에 대한 코드를 안짜도 됩니다.
모든 오브젝트의 어미에 미리 void OnButtonPressed(){ this.die(); } 를 선언하고 관장하는쪽에 등록 해두기만하면 전혀 호출할 필요가 없습니다.
왜냐하면, 버튼이 눌렸을 경우 버튼을 관장하는 매니저에서 OnButtonPressed를 자동으로 호출할 것이기 때문입니다.
그리고 그 것을 호출하는데에는 우리가 아니더라도 그쪽에서 for문을 돌필요도 없습니다. 하나의 행위자에 같은 행위를 지닌 수많은 오브젝트를 포함할 수 있기때문이죠.(잘은 모르겠지만 대리자(delegate)위임이라는 기능일겁니다.)
우리가 해야할일은 매니저의 OnButtonPressed 행위자에 우리 오브젝트를 등록해주면됩니다.
매니저는 아마 다음처럼 구현되어있을겁니다.
class ButtonManager{
delegate void ButtonPressedEvent();
// 델리게이트를 사용하기위한 변수입니다.(변수이자 함수로 봐도 무방합니다)
ButtonPressedEvent onButtonPressed;
// 이벤트를 핸들링 하기위해 버튼매니저에 오브젝트를 등록받는 함수입니다.
void Regist(WorldInObject obj){
this.onButtonPressed += obj.OnButtonPressed;
}
// 이렇게도 등록할 수 있습니다.
void Regist(ButtonPressedEvent buttonPressedEvent){
this.onButtonPressed += buttonPressedEvent;
}
// 이것도 버튼을 주관하는 다른곳에서 쏴주는 거라고 칩시다.
void OnButtonPressed(){
this.onButtonPressed();
}
이걸 메서드 위임이라고 합니다. 그밖에도 다양한 기능들이 있는데요.
저도 사실 델리게이트를 잘 안써서 이런식으로 써본적은 없지만 기본적인 사용예는 되었으리라고 봅니다.
(델리게이트의 사용법이나 용어들이 좀 틀렸을수도 있는데 일단 말씀드리고자 하는 포인트는 맞으니 그부분만 봐주시면 됩니다;)
조금 더 나가볼까요?
위의 코드는 오브젝트 내의 메서드를 전달해서 오브젝트 입장에서는 피동적으로 메서드가 호출될 것입니다.
그 호출되는 메서드를 상속없이도 동적으로 변경할 수도 있습니다.
class WorldInObject{
ButtonManager.ButtonPressedEvent OnButtonPressed = null;
}
저 객체가 생성될 시점에서...
WorldInObject obj = new WorldInObject();
obj.OnButtonPressed = new delegate(){
// obj.die(); // 아까전의 this.die(); 와 같습니다.
obj.alive(); // 살아나는것으로 바뀌었네요.
// 즉, 상속하지 않고도 이제 객체마다 다른 행위를 할 수 있게 되었습니다!
}
델리게이트를 잘 사용하면 이벤트 규격(함수형태)만 잘 정의하면 필요한정보를 필요한 오브젝트 전원에게
힘들이지 않고 전달하는 일이 가능합니다.
가령, 객체집합군 중에서 일정의 객체에만 특정한 무언가를 전달하기위해서 복잡한 코딩을 안해도 됩니다.
당연히 포문같은걸 돌 필요도 없구요... 어찌보면 함수를 변수화한다는 모든 개념이 적용될 수 있기때문에
행위의 바리에이션이 좀 더 다양해지면서도 코드의 구축에 힘들일 필요가 없어집니다.
(단순한 이벤트리스너라면 여기서 하드코드가 안섞일 수 없겠지만 델리게이트는 그런식으로 작업하지 않아도 좋은 결과를 낼 수가 있을것입니다.)
사용법은 무궁무진한데 갑자기 쓰려니까 딱히 정리가 안되네요.
C#을 사용하는 개발에서 델리게이트 안쓰면 좀 손해가 큽니다.
아무튼 이정도만해도 상당히 유용한것을 아시리라 봅니다.
만족하셨다니 다행입니다.
아침에 쓰고 집에가서 보니 조금 설명이 부족한 부분이 있는데요.
물론 따로 쓰지 않아도 이해하셨겠지만은...
버튼매니저의 이 부분에서...
void OnButtonPressed(){
this.onButtonPressed();
}
다시 설명드리면 ButtonManager.OnButtonPressed 함수 역시 다른곳에서 호출하는 함수이며(왜냐하면 버튼이 눌렸는지 체크하는 루틴은 반드시 모든 코드 내에 하나는 있어야되는데 쓰기가 번거로워서 이놈도 다른 버튼이 눌렸는지 체크하는 곳에서 체크되는 이벤트 핸들러라고 썼습니다;;)
이 함수가 호출될때 매니저 내의 델리게이트를 함수로 호출하여, 델리게이트에 등록된(+=) 다른 객체의 동일 포맷의 함수를
같이 호출시켜주는 겁니다.
이부분이 좀 미흡한듯하여 보충합니다.
'유니티 > Note' 카테고리의 다른 글
| 유니티 스크립트 호출 순서 제어 (0) | 2014.04.09 |
|---|---|
| 유니티 인벤토리 관련 구현 (0) | 2014.04.07 |
| delegate, action, event 활용 관련 (0) | 2014.04.07 |
| 안드로이드 In-app Billing Version 3 - 구글번역 (0) | 2014.03.27 |
| 파이어 폭스 유용한 부가기능 (0) | 2014.02.24 |
| 유니티 광고 수익 (0) | 2014.02.18 |
유니티는 다양한 에셋들을 사용해서 개발의 편의성을 높이고 있습니다.
Prime31이나 각종 애드몹 관련 플러그인들도 이와 같이 개발의 편의성을 높이는 플러그인입니다. 이런 플러그인을 직접 돈주고 사면 좋겠지만.
저희 같은 가난한 개발자 및 학생들은 직접 유니티와 자바의 연동을 통해서 구현해야됩니다.
여기서는 자바 클래스와 연동하는 방법을 간단하게 소개하겠습니다.
각각 호출할때 기본적인 함수들이 있습니다.
유니티에서는 자바 클래스를 호출할때
AndroidJavaObject.Call 로 자바 클래스의 함수를 호출할수 있습니다.
자바클래스에서 유니티를 호출할때는
UnityPlayer.UnitySendMessage 함수를 사용하여 호출합니다.
유니티로 제작된 게임을 자바 클래스를 통해 확장하는 방식은 2가지가 있는데
첫번째 방식은 자바 클래스를 별도로 제작한 후 유니티 프로젝트 폴더의 Plugins/Android 폴더에 올려서 확장하는 방식이고
두번째 방식은 유니티 내에서 이클립스로 export해주어서 확장하는 방법입니다.
jar 파일을 생성해서 관리하는것이 좀더 편한것 같으니 첫번째 방식을 사용하겠습니다.
먼저 jar 파일을 생성할 프로젝트를 이클립스에서 생성해줍니다.
패키지 이름을 com.test.androidjartest 로 지정했는데 유니티 내의 Bundle Identifier 항목과 일치해야됩니다.
Edit - Project Settings - Player 에서
안드로이드 모양의 버튼을 누르면 Bundle Identifiire 를 수정할수 있습니다. 위에서 만든 패키지 이름과 일치 시켜줍니다.
이클립스에서 프로젝트를 생성하고 난다음에는 유니티가 제공하는 jar 파일을 임포트 해주어야 유니티가 제공해주는 함수를 사용할수 있습니다.
유니티가 제공하는 jar 파일은 classes.jar 파일이며 경로는 설치된 폴더에서 Editor/Data/PlaybackEngines/androidplayer/bin 폴더에 존재합니다.
jar 파일을 추가하는 방법은 프로젝트 폴더에서 오른쪽 버튼을 누르고 properties 를 누릅니다.
그리고 JaVa Build Path 에서 Libraries 에서 Add External JARs 버튼을 누르고 해당 경로에 있는 jar 파일은 선택해주고
Order and Export 에서 불러온 jar 파일을 체크해주고 ok를 누릅니다.
이클립스에서 만들어진 MainActivity 를 위와 같이 고쳐줍니다. 소스를 모두 수정하면 이 소스를 jar 파일로 만들어 exprot 해주겠습니다.
프로젝트 폴더에서 오른쪽 버튼을 누르고 Exprot 를 클릭해줍니다. 그리고 위 처럼 Jar file을 누르고 next 버튼을 눌러주고
자신의 프로젝트에서 src 폴더만 체크 해주고 Jar File 의 이름을 설정해주고 finish 버튼을 누르면 jar 파일이 완성됩니다.
이제 유니티로 넘어오겠습니다.
유니티 내에서는 jar 파일을 인식하기 위해서는 반드시 해당 경로에 jar 파일이 존재해야됩니다. 안드로이드 같은 경우네는
Plugins/Android 폴더에 jar 파일이 존재해야됩니다.
그리고 해당 jar 파일을 실행하기 위해서는 AndoridManifest 및 res 폴더가 필요하므로 위에서 만든
jar 파일과 res 폴더 AndroidManifest 파일들을 Android 폴더에 집어 넣어줍니다.
이제 모든 세팅이 완료 되었습니다.
이제 제대로 유니티에서 -> 자바 클래스로 자바 클래스에서 유니티로 함수가 호출되는지 보겠습니다.
빈게임 오브젝트를 만들고 AndroidManager로 이름을 변경합니다.(반드시 AndroidManager로 지어주어야 됩니다.)
그리고 AndroidManager 에 아래 스크립트를 할당해줍니다.
AndroidManager 내의 Start 함수에서 MainActivity 자바 클래스의 HelloFunction 함수를 호출(_activity,Call("HelloFunction)하고,
자바 클래스에서는(이클립스) AndroidManage 클래스의 AndroidLog 함수를 호출(UnityPlayer.UnitySendMessage("AndroidManager", "AndroidLog", "Hello!");)하는 구조입니다.
할당후 안드로이드 단말기에서 빌드를 하면 아래와 같이 로그를 출력할 것입니다.
'유니티 > 스크립트' 카테고리의 다른 글
| PlayerPrefs 배열로 저장하기. (0) | 2014.04.08 |
|---|---|
| NGUI 스크롤뷰 grid 아이템 생성시 순서대로 생성되게 하기. (0) | 2014.04.08 |
| 유니티 안드로이드 확장 개발 - jar 파일(이클립스연동) (3) | 2014.04.02 |
| 인앱빌링 구현하기 ver3 - 구글번역 (0) | 2014.03.28 |
| 안드로이드 서버 php 통신(간단히) (11) | 2014.03.27 |
| 유니티 xml 파일 로드 (0) | 2014.03.18 |
-
-
Ku 2014.10.21 23:04
실행하였다니 아래와 같은 오류가 발생하였습니다 ㅠㅠ 왜인지 감이 안옵니다 ㅠㅠㅠㅠㅠㅠ
Error building Player: CommandInvokationFailure: Failed to re-package resources. See the Console for details.
C:\Users\kyoungku\Desktop\Company\adt\sdk\build-tools\android-4.4W\aapt.exe package --auto-add-overlay -v -f -m -J gen -M AndroidManifest.xml -S "res" -I "C:/Users/kyoungku/Desktop/Company/adt/sdk/platforms/android-20\android.jar" -F bin/resources.ap_
stderr[
res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'.
res\values-v11\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light'.
res\values-v14\styles.xml:8: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.
]
stdout[
Configurations:
(default)
v11
v14
hdpi
mdpi
xhdpi
xxhdpi
w820dp
Files:
drawable\app_icon.png
Src: () res\drawable\app_icon.png
drawable\ic_launcher.png
Src: (hdpi) res\drawable-hdpi\ic_launcher.png
Src: (mdpi) res\drawable-mdpi\ic_launcher.png
Src: (xhdpi) res\drawable-xhdpi\ic_launcher.png
Src: (xxhdpi) res\drawable-xxhdpi\ic_launcher.png
layout\activity_main.xml
Src: () res\layout\activity_main.xml
menu\main.xml
Src: () res\menu\main.xml
values\dimens.xml
Src: () res\values\dimens.xml
Src: (w820dp) res\values-w820dp\dimens.xml
values\strings.xml
Src: () res\values\strings.xml
values\styles.xml
Src: () res\values\styles.xml
Src: (v11) res\values-v11\styles.xml
Src: (v14) res\values-v14\styles.xml
AndroidManifest.xml
Src: () AndroidManifest.xml
Resource Dirs:
Type drawable
drawable\app_icon.png
Src: () res\drawable\app_icon.png
drawable\ic_launcher.png
Src: (hdpi) res\drawable-hdpi\ic_launcher.png
Src: (mdpi) res\drawable-mdpi\ic_launcher.png
Src: (xhdpi) res\drawable-xhdpi\ic_launcher.png
Src: (xxhdpi) res\drawable-xxhdpi\ic_launcher.png
Type layout
layout\activity_main.xml
Src: () res\layout\activity_main.xml
Type menu
menu\main.xml
Src: () res\menu\main.xml
Type values
values\dimens.xml
Src: () res\values\dimens.xml
Src: (w820dp) res\values-w820dp\dimens.xml
values\strings.xml
Src: () res\values\strings.xml
values\styles.xml
Src: () res\values\styles.xml
Src: (v11) res\values-v11\styles.xml
Src: (v14) res\values-v14\styles.xml
Including resources from package: C:\Users\kyoungku\Desktop\Company\adt\sdk\platforms\android-20\android.jar
applyFileOverlay for drawable
applyFileOverlay for layout
applyFileOverlay for anim
applyFileOverlay for animator
applyFileOverlay for interpolator
applyFileOverlay for transition
applyFileOverlay for xml
applyFileOverlay for raw
applyFileOverlay for color
applyFileOverlay for menu
applyFileOverlay for mipmap
Processing image: res\drawable\app_icon.png
Processing image: res\drawable-hdpi\ic_launcher.png
Processing image: res\drawable-mdpi\ic_launcher.png
Processing image: res\drawable-xhdpi\ic_launcher.png
(processed image res\drawable-mdpi\ic_launcher.png: 82% size of source)
Processing image: res\drawable-xxhdpi\ic_launcher.png
(processed image res\drawable-hdpi\ic_launcher.png: 77% size of source)
(processed image res\drawable\app_icon.png: 94% size of source)
(processed image res\drawable-xhdpi\ic_launcher.png: 74% size of source)
(processed image res\drawable-xxhdpi\ic_launcher.png: 72% size of source)
(new resource id app_icon from drawable\app_icon.png #generated)
(new resource id ic_launcher from hdpi\drawable\ic_launcher.png #generated)
(new resource id ic_launcher from mdpi\drawable\ic_launcher.png #generated)
(new resource id ic_launcher from xhdpi\drawable\ic_launcher.png #generated)
(new resource id ic_launcher from xxhdpi\drawable\ic_launcher.png #generated)
(new resource id activity_main from res\layout\activity_main.xml)
(new resource id main from res\menu\main.xml)
]



You are brilliant. This worked like a dream, albeit with some modification to my inventory managing but it worked out perfectly. This is where I was trying to go with my script, but I had no idea how to approach this. Thank you very much for showing me.