2015年1月13日 星期二

Unity 自訂的 Editor


在寫自訂的 Editor 時, 一定會遇到的大問題就是在 Play / Edit 模式的切換後, 

Editor 中的內容就會消失, 就算你把變數設成 static 也沒有法子保住資料.

拜讀了這篇文章後, 也將手中的編輯器告了一段落,

確定了這篇應是自訂 Editor 開發者的必讀的文章!

個人認為的重點:
1. play/ edit 模式切換時 Unity 做了什麼事.
2. 自訂的 class 使用 [Serializable] 是不夠的.
3. 自訂的 class 繼承自 ScriptableObject 的好處.
4. ScriptableObject hideFlags 的義意.

了解之後, 大家就能成功的做出穩固的資料結構, 讓編輯中的寶貴資料得以留存.

2015年1月5日 星期一

分享一下 android 獨立發開者互助下載的心得

大家好, 我是 DOG-Z 作者 Arc , 我又來了.
今天想分享一下 android 獨立發開者互助下載的心得.
========================================
我之前一直想開發、成立一個開發者互助下載的軟體、社群, (也許這也是一門生意)
想說 APP 開發者們之間可以互相下載彼此的軟體,
但實際加入各社群, 可以發現開發者們並不是那麼的熱情,
在各個互助社群上千名的成員中, 約只有數十位的人會互相加油打氣下載 APP.(也許是其中有多數人加入社群只為了貼文打廣告.)
我在社群裡只下載我認為有新意、完成度尚可的軟體.
其它 clone 的作品或容量小的, 我有空時也幫下載後給評價.
最近(2014/12/20)收到一封信, 請我加入他們做的一個開發者的互助下載軟體,(果然有人開發出來了)
它的規則是:
1.你下載別人的 APP 可以得到一個 credit,
2.你的 APP 被下載你會被扣一個 credit,
3.當你的 credit 小於 0 , 你的 APP 將不會顯示在下載清單裡.
4.APP下載後, 要保留在手機裡 2 , 否則不會得到 credit.
5.很少機會會跳出廣告.
很簡單的摡念, 但是卻很有效! 比你在各個開發者社群貼文有效幾十倍.
它讓開發者們有回饋, 更積極的去下載別人的 APP.
它沒有交談留言, 但我們一樣能去 Google Play 裡留言打氣.
試用這個 APP 到至今約有 77 的下載量(因為我也只下載了 77 APP)
如果大家開發出 APP 想取暖一下, 或想互助一下的可以試看看這個軟體.
當然, 想靠它衝排行是不太可能的, 畢境你的下載量沒那麼大.
最後, 請認清...
上面都是開發者, 不是玩家.
上面都是開發者, 不是玩家.
上面都是開發者, 不是玩家.
應用:
(目前己下架 2017/11/19)https://play.google.com/store/apps/details?id=com.app.promotion.free

官網:
(目前己下架 2017/11/19)
http://androidapppromotion.com/

關於 "巴哈姆特" 廣告帶來的效益, 想跟大家分享一下.

大家好, 我是 DOG-Z 作者 Arc ,我又來了.
有一個關於 "巴哈姆特" 廣告帶來的效益, 想跟大家分享一下.
//========================
// 前言
//=========================
* 在玩家的社群我並沒有特別提出這是國人獨立製作的遊戲. 因為不想討同情.
* 一切都不用花錢, 只花時間.
* 在開發者的社群貼遊戲上架的短文對遊戲下載量沒有大幫助.
* 在開發者的社群貼遊戲上架的短文對遊戲下載量沒有大幫助.
* 在開發者的社群貼遊戲上架的短文對遊戲下載量沒有大幫助.
//========================
// 時間與事件
//========================
*2014/09/21 遊戲上架, 在各 G+ 及 FB 的 app 社群貼遊戲上架的短文.
*2014/09/26 巴哈姆特作品列入資料庫
*2014/09/29 巴哈姆特試玩新聞登出.
*2014/10/06 滿一週.
//========================
// 由附圖可以看出,
//========================


*作品列入資料庫 : 對下載量沒多大影響.
*試玩新聞登出: 下載量大量增加數百.
*試玩新聞的觀看人次有 7000 左右.
*至目前為止下載量 996 次.
最後:
試玩的新聞, 在這類遊戲裡約可以吸引 7000 人來看, 約有 900 多人會來下載遊戲.大家看完應有自己的心得了吧,

小弟最近在 google play 上架了一個遊戲

跳跳機器狗Z  DOG-Z

小弟最近在 google play 上架了一個遊戲, 今日算是滿一周了,
有些關於廣告的數值想跟大家分享一下.
* 遊戲中使用的廣告商是 adconlony ,
* 使用看影片給虛寶的回饋式廣告(在他們公司這叫 Value Exchange/V4VC ).
* 計價方式為完整看完廣告才計價. CPCV (Cost Per Completed Video)
* V4VC 廣告限制玩家每日可看的廣告為 20 次.
* 收入滿 $100 美元才可領出.
* 國外的開發者領錢的方式有: 支票、PayPal、轉帳. (For international partners, we offer check, PayPal, or wire transfer. There is a fee for wire transfers and PayPal transfers requires a transaction fee as well.)
目前為止廣告完整被看完的次數為 120, 收入為 $0.50 美元
CVVs (Completed Video View ) : 120
Earnings : $0.50
我也不知這樣計價方式是算多還是少. 提供給還在找廣告商, 想導入廣告的戰友們參考一下。
最後打個廣告
DOG-Z 歡迎大家下載玩玩哦! 謝謝大家!
https://play.google.com/store/apps/details?id=com.arclee.tread

2014年7月1日 星期二

Android 顯示已安裝的軟體

自從看到手機可能有間諜軟體後,

便好奇 app store 上的軟體為何可以偵測出應用程式是否為間諜

我猜, 無非就是例出所有已安裝的應用程式 package,

並查出它們的使用到了那些權限 (Permissions)

再交由使用者決定是否要砍殺這個 package

其中應可以再列出 service 來判斷是否為間諜


  • 一、列出已安裝軟體
http://www.androidsnippets.com/get-installed-applications-with-name-package-name-version-and-icon

chris 示範了如何列出已安裝軟體, 利用 PackageManager().getInstalledPackages() 來完成. 其中還可分別是否為系統 package.

boolean issys = (p.applicationInfo.flags & p.applicationInfo.FLAG_SYSTEM) > 0;
  • 二、Layout
RelativeLayout
         scrollView1 (ScrollView 下只可以有一個 child view)
               linearLayout1 (垂直)
                     linearLayout   (水平 , 程式動態加入)
                             ImageView  (應用程式圖片, 程式動態加入)
                             TextView (應用程式名, 程式動態加入)


  • 三、程式
  1. ScrollView 下只可以有一個 child view.
  2. Fragment 在 onStart 時, 加入程式動態加入的元件


@Override
public void onStart ()
{
super.onStart();
Log.v("app", "PlaceholderFragment::onStart");
Log.v("app", "getView():" +getView());
//TextView tv = (TextView)getView().findViewById(R.id.textView2);
//Log.v("app", "textview :" + tv);
ArrayList<PInfo> apps = ArcAndroidTool.getPackages(this.getActivity(), true);
//linearLayout1.
LinearLayout ll1 = (LinearLayout)getView().findViewById(R.id.linearLayout1);
Log.v("app", "LinearLayout1 :" + ll1);
final int max = apps.size();
for (int i=0; i<max; i++)
   {
//linearlayout.
LinearLayout ll = new LinearLayout(getActivity());
//icon.
ImageView iv = new ImageView(getActivity());
iv.setImageDrawable(apps.get(i).icon);
ll.addView(iv);
//package name.
TextView tv = new TextView(getActivity());
tv.setText(apps.get(i).appname);
ll.addView(tv);
//水平.
ll1.addView(ll,  new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));

       }        
}

2014年6月4日 星期三

Unity Android Callback

Unity Android Callback

在 Unity 建立一個 Callback 讓 Android plugin 做完某事之後呼叫.


一、Eclipse
1. 建立一個 interface
例:
public interface CAdLocusListenerCallBack {
void onReceiveAd();
void onFailedToReceiveAd(int errorcode);
}

2. 把它加入至某 class 裡
例:
public class CAdLocus
{
    //callback.
    CAdLocusListenerCallBack listenerCB = null;

    public void SetListenerCB(CAdLocusListenerCallBack cb)
    {
    listenerCB = cb;
    }
}

3.做完事後呼叫 Callback
例:
    public void onReceiveAd(Ad adView )
    {
    //AdLocusLayout llayout = (AdLocusLayout)adView;
    if (listenerCB != null)
    {
    listenerCB.onReceiveAd();
    }
    }


    public void onFailedToReceiveAd(Ad adView , com.adlocus.AdLocusLayout$ErrorCode errorCode)
    {
    if (listenerCB != null)
    {
    listenerCB.onFailedToReceiveAd(1);
    }
     }

二、Unity
1.建立 Callback 腳本
例:
public class AdLocusListenerCallBack : AndroidJavaProxy
{
public AdLocusListenerCallBack():base("com.ad.adlocus.CAdLocusListenerCallBack")
{
}
void onReceiveAd()
{
}
void onFailedToReceiveAd(int errorcode)
{
}
}

2.對 Plugin 註冊 Callback
例:
AndroidJavaClass player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" );
AndroidJavaObject activity = player.GetStatic<AndroidJavaObject>("currentActivity");
AdLocusJo = new AndroidJavaObject("com.ad.adlocus.CAdLocus", activity);
AdLocusListenerCallBack AdListenerCB = new AdLocusListenerCallBack();
AdLocusJo.Call("SetListenerCB", AdListenerCB);

四、最後
也有人是直 sendmessage 的方式接調用 Unity 物件的函式,
例:
//unity
void gameobjectFunction(string parm)
{
}
//Java
UnityPlayer.UnitySendMessage("gameobjectName", "gameobjectFunction", "parms");

Unity Adlocus 整合

Unity Adlocus 整合

有機會在 google 上遇到了 AdLocus , 也收到了對方傳來的 SDK , 所以也就整合測試了一下

android 上使用 unity 的 active 建立出一個 FrameLayout , 用來置放廣告. 其它小地方請參考官方文件.

一、Eclips 建立 plugin
1. 建立 Android Application Project 不要勾選 Create custom launcher icon 及 Create active 可建立乾淨的專案.
2. 建立自己的 package "com.ad.adlocus" 與 class "adlocus"
3. class 建構式上傳入 unity 的 activity
例:
    public adlocals(Activity currentActivity)
    {
    mActivity = currentActivity;
    }

4. 建立 FrameLayout
例:
    private void CreateFrameLayout()
    {
    if (framelayout == null)
    {
    framelayout = new FrameLayout(mActivity);
    mActivity.addContentView(framelayout,new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT));
    }
    }

4. 對 view 的操作要在 active 的 thread 上.
例:
    public void ShowAD()
    {
        mActivity.runOnUiThread(new Runnable()
        {
public void run()
            {
    framelayout.removeView(adlocusLayout);
    framelayout.addView(adlocusLayout, adlocusLayoutParams);
framelayout.invalidate();
            }
        });
    }

5. Export 成 jar
選我們的專案, 勾選 Export all output folders for checked projects 即可. 命名為 myAdLocus.jar

二、 Unity
1. 建立 Plugin 資料夾 Assets\Plugins\Android
2. 把剛才建立的 myAdLocus.jar copy 進來.
3. 把 adlocus_sdk_3_2_6.jar copy 進來
4. 如果沒有 AndroidManifest.xml 可由 Unity Editor\Data\PlaybackEngines\androidplayer 下 copy AndroidManifest.xml 至   Assets\Plugins\Android
5. 加入 adlocus 使用說明裡的  uses-permission
6. 寫腳本呼叫 jar
例:

if (GUI.Button(new Rect (0, 100, 100, 100), "adlocals"))
{
if (!isAdlocusInital)
{
AndroidJavaClass player = new AndroidJavaClass( "com.unity3d.player.UnityPlayer" );
AndroidJavaObject activity = player.GetStatic<AndroidJavaObject>("currentActivity");
AdLocusJo = new AndroidJavaObject("com.ad.adlocus.adlocus", activity);
isAdlocusInital= true;
}

AdLocusJo .Call("SetAppID", "a9f0973dc1d03695be3f**************");
AdLocusJo .Call("SetTestMode", true);
AdLocusJo .Call("Inital");
}

if (GUI.Button(new Rect (0, 200, 100, 100), "adlocus show"))
{
AdLocusJo .Call("ShowAD");
}

if (GUI.Button(new Rect (0, 300, 100, 100), "adlocus hide"))
{
AdLocusJo .Call("HideAD");
}

三、最後
遊戲要上架才會有廣告播放, 一般模式下會看不到廣告(透明), 測試模式下會看到測試廣告.