2020年7月25日 星期六

系統功能 社群好友

我們來談一下社群好友功能吧

大部分的連線遊戲經營到後期,不外乎會需要社群去維持遊戲的活耀人數,
而良好的社群機制,可以提高玩家願意持續進行重複遊戲操作的體驗,
重點是人的反應在遊戲中所帶給玩家們的驚奇感,往往是遊戲機制上難以去呈現的


營運面:
待補充...

設計目的:
1. 提升玩家在遊戲中的生命週期
2. 藉由玩家在互動的過程刺激消費

設計初衷:


設計要領:
玩家之間的連結性越強,越不容易流失
玩家互動的過程產生樂趣


設計方法:
待補充...


玩家面:
待補充...


玩家動機:
利用對方玩遊戲玩得好的特性
可以邊玩邊聊天的特性
一起玩會有額外獎勵的特性

利用自身優缺點找平衡的方式
喜歡用自己的玩法玩 但又有缺陷 找其他玩家補足自己的缺陷

心理預期:
待補充...


體驗過程:
玩家感覺是在跟人玩遊戲
期待好友玩家上線

玩家手段:
1. 拉現實中的好友一同遊戲
2. 認識好朋友

成功經驗不能複製 但失敗的可以




Unity UGUI使用心要



UGUI 把設置SetActive開關 做到Canvas.enabled 這樣子 所有的Awake and Start就可以呼叫到了
然後開關所耗的效能就會變得更小

Canvas 靜態與動態面板要分開 靜態面板要勾static

何謂靜態 就是不改變 RectTransform內部的參數。可以做單純的開關變化與其他參數調整

禁止使用Awake 與 Start 在會開關的物件上,自己寫init呼叫使用

面板開關要寫在自己物件上 給外面存取使用

先把設定參數放在面板打開前先設定好
面板關閉後 再設定參數 可以減少畫面上的瞬間變化

資料最好統一由一個資料管理員處理
每個UI的資料都去抓他的來用,UI本身不放暫存,在資料做變化時,通知UI事件觸發的方式去變更UI顯示資料。

手機解決黑頻問題
Use 32-bit Display Buffer 不要勾選.... 舊機子很容易閃退 或是 黑頻....




狀態機 模式

using System.Collections;
using System.Collections.Generic;

/*
    泛用型 狀態機

    可以讓使用者 專注寫狀態就好

    對外直接使用 AI<T>

    撰寫邏輯使用繼承 State
    State內取用 樣板資料 來取得客製化數據 來做對應的變化

    事件取用方式?

    對外事件操作方式
        取得data後 可自行註冊內部事件

    定義資料
        這裡面定義可能要處理的資料與行為
    定義狀態類別 : state
        這裡面使用資料
    定義AI : AI<資料>
        讓外部取得data連結 然後做控制
        AI本身就是執行動作
*/

/// <summary>聖淨之風</summary>
namespace Aether
{
    /// <summary>行為</summary>
    public class AI<T> where T : new()
    {
        /// <summary>狀態機</summary>
        Context context = new Context();

        /// <summary>建構式</summary>
        public AI()
        {
            context.data = new T();
        }
        /// <summary>執行動作</summary>
        public void RunAction()
        {
            context.RunAction();
        }
        /// <summary>取得目前狀態</summary>
        /// <returns>目前狀態</returns>
        public string GetState()
        {
            return context.GetState();
        }
        /// <summary>取得資料</summary>
        /// <returns>回傳資料</returns>
        public T GetData()
        {
            return (T)context.data;
        }
    }
    /// <summary>狀態機</summary>
    public class Context
    {
        /// <summary>資料</summary>
        public object data = null;
        /// <summary>狀態池 - 減少new的使用</summary>
        Dictionary<string, State> stateDict = new Dictionary<string, State>();
        /// <summary>目前狀態</summary>
        State stateNow;

        /// <summary>更換狀態</summary>
        /// <typeparam name="T">狀態類別</typeparam>
        public void ChangeState<T>() where T : State, new()
        {   //取得狀態
            string l_strClassName = typeof(T).Name;
            State l_state = stateDict[l_strClassName];
            if(l_state == null)
            {
                l_state = new T();
                stateDict.Add(l_strClassName, l_state);
            }

            stateNow = l_state;
            stateNow.SetContext(this);
        }
        /// <summary>執行動作</summary>
        public void RunAction()
        {
            stateNow.RunAction();
        }
        /// <summary>取得目前狀態</summary>
        /// <returns>目前狀態</returns>
        public string GetState()
        {
            return stateNow.GetClassName();
        }
        /// <summary>取得資料</summary>
        /// <typeparam name="T">類型</typeparam>
        /// <returns>類型</returns>
        public T GetData<T>()
        {
            return (T)data;
        }
    }
    /// <summary>狀態</summary>
    public class State
    {
        /// <summary>狀態機</summary>
        protected Context context = null;

        /// <summary>設定狀態機</summary>
        /// <param name="i_context"></param>
        public void SetContext(Context i_context)
        {
            context = i_context;
        }
        /// <summary>運作行為</summary>
        public virtual void RunAction()
        {
        }
        /// <summary>取得類別名稱</summary>
        /// <returns>類別名稱</returns>
        public string GetClassName()
        {
            return this.GetType().Name;
        }
    }
}

首儲獎勵設計

最近在思考 消費後所帶給玩家的反差感 過低的消費額度 很難製造反差 或是 成本太低 製造反差給予玩家的獎勵設計制度不能太高

不過大多數遊戲為了能夠促使玩家做出首次消費 來提升 往後消費意願 往往都會設計 首儲獎勵 首儲獎勵通常會給予很高的反饋 而這個反饋也只有第一次有效 這樣既能刺激新進玩家消費 也能夠保持一般消費玩家的公平性

而首儲獎勵的獎勵內容物 最好是當玩家第一次接觸遊戲時 能夠清楚明瞭滿足當下需求的獎勵
不要設計需要玩家在玩一陣子之後才會有需求的內容物 而是當下就有迫切需求的內容物 比如:鑽石、體力、新手裝備、高星角色之類 通常都是給予玩家能夠更順暢的進行遊戲體驗為主

2019年9月24日 星期二

行銷文案的心得

通常我們在做行銷文案時 會有幾點需要先拿出來討論確定

1.行銷目的:這邊通常會是由主管制定
而我們目前看這篇文章 讓我有點混淆 不知道主要的目的是 推IP 還是 遊戲 不要說 都有 因為主題明確 針對的文案內容 都會是環繞這個主題去強化 這樣 文案才有較強的吸引作用 也會有比較好的成效

2.推廣對象: 這邊通常會我們想要主打的客群 取得方法有
1) 透過市場數據收集分析
2) 利用較資深的成員彼此分享情報的方式

3.內容價值: 這邊通常會需要依照我們設定的對象去做設定
將能夠吸引這些客群目光的 內容特色 列舉出來 在文章中打磨成 利器, 價值避免使用形容詞 而是確切的敘述內容趣味性與價值。
比如:擁有強大的劇本故事性與豐富的角色設定
這句話 讓玩家想像 不如直接描述 玩家在遊戲中不但可以體驗到魔法、劍術的世界 還有遊戲中有 廖添丁 與 福爾摩斯 等豐富的時代人物 進入這個世界與主角互動的樂趣
要讓讀者能夠一眼看出 有哪些內容 當然這些內容也要讓讀者容易進入畫面 理解這些樂趣 (這邊我比喻可能不是很好 需要再修飾

4.呼籲行動: 在文案中會埋下一些伏筆 誘使玩家去做出我們期待的回應
這邊我們主要是募資,那就要去思考 這整篇文章 如何去凝聚讀者點開幕資網頁的力氣 讓他們想要繼續下去 滿足目前他們內心中的渴望

當我們把一份文案的架構定義清楚之後 可以先試著寫一篇 以敘述性為主的文章 之後再來調整與優化 內容與詞句 讓他們更有利於讀者去行動達成我們的行銷目的

文章的內容 盡量避免用名聲、人氣、知名 或是 我們有多努力之類的方式 去做敘述 讀者想讀的內容不是這個 想讀的內容是 這是不是我的菜 文章內容能提供給我的價值 夠不夠吸引我去關注它 我可以在這之中獲得到什麼?
在撰寫文案時 盡可能去模擬各種讀者內心讀完這篇文章的感想 來去調整與優化內文 試著讓讀者產生期待 與 想要的感覺 來去回應我們的行銷目的.

最後就是大家集思廣益 想一個好的 新聞標題
一個好的標題 佔了80%這份文案是否能在一開始 在找尋潛在顧客時 確實的抓進 我們想要的客群屬性 行銷內容主要是提升被我們抓近來客群的關注度 到願意成為我們的產品客群

創意發想 設計初衷

我們來談一下設計初衷吧

我們在進行遊戲設計時,大部分會經過三個步驟:
1. 核心概念:這可以是一句話或歌曲,或是一種情感表達,或是敘述一種理念。
2. 玩家體驗:玩這款遊戲時,會有那些感覺或情緒,是否符合核心概念所要體現的。
3. 遊戲功能:設計相對應的玩家操作介面與遊戲機制,進而讓玩家感受這種體驗。

而設計機制大致也分為兩種:
1.情感面的設計:
主要是能夠引起玩家情緒反應的功能。
例如:劇情系統、聊天系統、表情符號等

2.便利面的設計:
主要是能夠使玩家在操作上更為便利。
例如:設定系統、操作系統、資訊瀏覽等

希望我們常去思考遊戲功能或獎勵是否能強化核心概念或是與核心形成強連結。

良好的設計方式是能夠恢復到設計初衷,
請小心的設計給予獎勵的方式,並時時觀察玩家的反應,
每個獎勵應當是去強化當時的設計初衷,
而不是額外去附加上去之後,反而讓玩家失焦,變得只想要獎勵本身。

要讓設計初衷達不到目的的方法就是設計過多額外獎勵。
身為製作者應渴望讓玩家逐漸去品味製作者想要讓玩家了解的核心概念是甚麼!


希望這篇文章對於你們有些幫助,也歡迎在底下留言一起討論分享彼此的心得。

2017年7月23日 星期日

Unity 呼叫 Java檔案

Unity 呼叫 Java檔案

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.unityplugin"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="15"
        android:targetSdkVersion="25" />

    <application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true" >
    </application>

</manifest>

//-----------------------
test.jar

package com.example.unityplugin;

public class pluginClass{
public static String getTextFromPlugIn(int Number){ return "Number"+Number}

}

PS 這兩個檔案丟到Asset/PlugIn/Android/lib底下
//-----------------------

PluginWrapper.cs



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PluginWrapper : MonoBehaviour {

// Use this for initialization
void Start () {
        TextMesh textMesh = GetComponent<TextMesh>();
        ///<summary>packageName,className</summary>
        var plugin = new AndroidJavaClass("com.example.unityplugin.pluginClass");
        textMesh.text = plugin.CallStatic<string>("getTextFromPlugIn",7);
}
// Update is called once per frame
void Update () {
}
}