2023年10月3日 星期二

Vue3 vue-typescript-admin-template npm run serve error fix


 - 支援 node.js v14 版本

 - 將 package.json 降版本 "webpack": "4.45.0"

 - 將TS嚴格模式關閉 tsconfig.json compilerOptions.strict = false


 - ERROR in src/components/Breadcrumb/index.vue:52:18

 matched = [{ path: '/dashboard', meta: { title: 'dashboard' } } as RouteRecord].concat(matched)

解:

const route: RouteRecord = {

        path: '/dashboard',

        meta: { title: 'dashboard' },

        regex: undefined,

        components: {},

        instances: {},

        props: false

      }

      matched = [route].concat(matched)

2021年4月6日 星期二

廣告置入遊戲設計

跳脫廣告破壞遊戲體驗的迷思 獎勵式廣告

最近被 google ads 政策變更傷了自己的廣告收益 他們禁止了換頁強制性的廣告 所有的廣告必須讓用戶自己願意點擊瀏覽才可以 後面想一想這樣也不錯 比較不會中斷用戶體驗.

而內購需求的發生是在於玩家對於未來的期待感 如果這款遊戲本身 玩家覺得不會玩很久 自然就不容易產生消費慾望了!

1.加入廣告機制 可以提升用戶留存率
我們通常在設計瓶頸上為了能夠卡玩家 讓玩家產生不適感進而進行 IAP 消費 但這樣的機制會逼走免費玩家 加入廣告機制 讓免費玩家採用瀏覽廣告的方式 突破瓶頸 一來提升官方收益 而來也提升了 玩家願意持續在遊戲上進行遊玩的意願度.

玩家流失通常會有障礙無法突破 或是成長緩慢 等問題
如果這些卡關都要透過付費解決 就容易氣跑玩家 所以適當的加入廣告 使玩家可以把透過不必付費的方法順利進行遊戲 也可以有效的提升留存率

2.加入廣告機制 可以提升用戶付費比
將廣告收入放入商城購買頁面之中 引導用戶點擊商城頁面 增加IAP曝光度 可以有效提升用戶的付費比.

3. 限制廣告點擊的次數 可以提升用戶瀏覽廣告的意願
會創造出稀缺性

2020年9月5日 星期六

花在別人身上的錢 比花在自己身上還要快樂?

每個人願意消費在遊戲上的額度上限是不一樣的

與其透過機制鼓勵玩家消費更多 不如讓具有更多消費額度的玩家消費更多在這些 消費能力有限的玩家身上

這是我最近跟朋友討論的議題 太多遊戲設計的是彰顯自己的價值 利用自己有強力的裝備與角色來做炫耀 讓他人吹膨自己 但當自己的強度膨脹到一個無人可及的地步時 就讓這些高端的消費族群流失掉了 很簡單 高處不勝寒 我是第一名了 然後呢? 頓時失去目標了 遊戲內容也很容易就被這些高端玩家以碾壓的方式體驗完 玩家的最後就只剩下競爭與聊天 而當成為第一 是孤單的

這類高消費者 為何願意砸重金來玩這款遊戲 絕對不要自吹自擂說 因為自家遊戲產品設計的好 而是這個玩家本身的條件與特質 如此而已

所以我在想把他的消費讓更多人收益 既然遊戲營運有9成的營收靠著5%的金字塔玩家在供應著 就應該要設計一個能夠讓他們持續消費的機制讓他們能夠保持遊玩動機與消費額 而這些玩家是需要這些低消於無課玩家去支持他們在遊戲中的地位

待續…

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 () {
}
}

2017年4月6日 星期四

Unity 開啟攝影機

using System.Collections;
using UnityEngine.UI;
using UnityEngine;

public class OpenCamera : MonoBehaviour
{
    /// <summary>顯示在此圖片上</summary>
    RawImage rimgShow = null;
    /// <summary>//接收攝影機返回的圖片數據</summary>
    WebCamTexture myCam;

    IEnumerator open_Camera()
    {
        //授權開啟鏡頭
        yield return Application.RequestUserAuthorization(UserAuthorization.WebCam);
        if(Application.HasUserAuthorization(UserAuthorization.WebCam))
        {
            //設置攝影機要攝影的區域
            //(攝影機名稱, 攝影機要拍到的寬度, 攝影機要拍到的高度, 攝影機的FPS)
            myCam = new WebCamTexture(WebCamTexture.devices[0].name, Screen.width, Screen.height, 60);
            rimgShow.texture = myCam;
            myCam.Play();//開啟攝影機
        }
    }
    // Use this for initialization
    void Start()
    {
        rimgShow = gameObject.GetComponent<RawImage>();
        StartCoroutine(open_Camera());//開啟攝影機鏡頭
    }
    /// <summary>開啟攝影機</summary>
    public void openCamera()
    {
        rimgShow.gameObject.SetActive(true);
        myCam.Play();//開啟攝影機
    }
    /// <summary>消滅</summary>
    void OnDisable()
    {
        //當程式關閉時會自動呼叫此方法關閉攝影機
        myCam.Stop();
    }
}


2017年3月27日 星期一

Unity 3D 移動公式 心得筆記

大家好,最近才領悟到心得筆記可以放在部落格,一來在自己找歷史資料時方便,二來也許整理的心得會有需要的人,也可方便取用,就這樣。

這邊若要活用移動方式,會建議學習向量相關的知識,會比較了解為何可以達到這種效果,但如果不學,看懂套用方式直接套用也可以,就看本身自己的需求如何了。

接下來介紹一下在Unity中,移動可分為 移動模式 和 移動方式
移動方式又有分非物理影響與物理影響的移動方式,因為我的專案目前還不需要用到,物理影響相關的公式,所以我這邊就不再特別介紹,等我需要的時候,再一併整理上來吧。

移動模式:移動中的路徑變化
  • Vector3.Lerp:根據來源地與目的地,兩點畫一直線做直線位移運動,以時間軸控制。
  • Vector3.Slerp:根據來源地與目的地,兩點畫一曲線做曲線位移運動,曲度由來源目標的物件方向與目的地的位置做角度偏移量決定。
  • Vector3.MoveTowards:與Vector3.Lerp做一樣的直線運動,控制項是以移動速度做為控制。
  • Vector3.SmoothDamp:與Vector3.Lerp做一樣的直線運動,但加入了時間軸控制與最大移動速度限制控制。
移動方式:移動時,是屬於跳耀方式還是連續性的位移
  • Transform.position:瞬間移動到定點位置 (較不受碰撞影響)。
  • Transform.Translate:平滑移動 (可受碰撞影響),會讓移動看起來更順,但需要位移時間。
可看需求搭配組合:
  • Transform.Position:定點跳耀的移動方式需搭配對應的移動模式。
  • Transform.Translate:本身就有支援直線位移的功能,所以只有非直線位移的方式,才需要額外撰寫移動模式。
接下來介紹實際使用的方式與內容。



Vector3.Lerp使用時機:
做直線運動時,並須要在特定時間內到達定點,或是想要在移動的過程中做漸快漸慢,因為是直線運動所以比較常跟transform.position做搭配使用。

函式宣告:
Vector3.Lerp(from : Vector3, to : Vector3, t : float) : Vector3
from:起始座標
to:目的座標
t:以時間軸控制位移[0, ... , 1],1秒鐘到達目的,0.5秒代表中間位置,所以自己要換算所需時間。
return:當下座標

使用範例:
public class example : MonoBehaviour {
 public Transform start;
 public Transform end;
 void Update() {
  transform.position = Vector3.Lerp(start.position, end.position, Time.time);
 }
}



Vector3.MoveTowards使用時機:
與Lerp一樣做直線運動,不一樣的地方是Lerp是控制時間軸,而MoveTowards是控制移動速度,當要做等速度移動或是保持某個速度移動時適用。

函式宣告:
Vector3.MoveTowards (current : Vector3, target : Vector3, maxDistanceDelta : float) : Vector3
current :起始座標
target :目標座標
maxDistanceDelta :保證移動時,不會超過我們設定的速度,正值就是追向目標,負值就是遠離目標。
return:當下座標

使用範例:
public class example : MonoBehaviour {
 public Transform start;
 public Transform end;
 void Update() {
  transform.position = Vector3.MoveTowards(start.position, end.position, 30.0f);
 }
}



Vector3.Slerp使用時機:從一個座標方向到一個目標座標畫一個弧線,使用時間軸控制位移座標,可以用於曲線移動到目標,比如火球術,或光球追跡彈。

函式宣告:
Vector3.Slerp (from : Vector3, to : Vector3, t : float) : Vector3
from:起始座標
to:目的座標
t:以時間軸控制位移[0, ... , 1],1秒鐘到達目的,0.5秒代表中間位置,所以自己要換算所需時間。
return:當下座標

使用範例:
public class example : MonoBehaviour {
 public Transform sunrise;
 public Transform sunset;
 void Update() {
  Vector3 center = sunrise.position + sunset.position * 0.5F;
  center -= new Vector3(0, 1, 0);
  Vector3 riseRelCenter = sunrise.position - center;
  Vector3 setRelCenter = sunset.position - center;
  transform.position = Vector3.Slerp(riseRelCenter, setRelCenter, Time.time);
  transform.position += center;
 }
}



Vector3.SmoothDamp使用時機:這是Lerp與MoveTowards的功能總合版本,會以漸快的方式達到一個速度後,保持速度,當目標不再移動時,會已漸慢速度移動到目標位置,感覺就像開車停車一樣,保持較為平滑變化較小的位移狀態,最常見的用法用於攝影機跟隨目標。

函式宣告:
Vector3.SmoothDamp(current : Vector3, target : Vector3, ref currentVelocity : Vector3, smoothTime : float, maxSpeed : float = Mathf.Infinity, deltaTime : float = Time.deltaTime) : Vector3
current:目前所在位置
target:目的地位置
currentVelocity:當前的速度 是返回值
smoothTime:達到目標的時間設定
maxSpeed:最大移動速度限制
deltaTime:上次調用此函數的時間 默認Time.deltaTime
return:回傳 更新的座標位置

使用範例:
public class example : MonoBehaviour {
 public Transform target;
 public float smoothTime = 0.3F;
 private Vector3 velocity = Vector3.zero;
 void Update() {
  Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10));
  transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
 }
}



Transform.position使用時機:當不需要碰撞,而且希望更迅速更省效能的方式移動到我們想移動到的位置時,可以選擇此方法。

物件宣告:
Transform.position : Vector3
無法直接針對裡面的xyz做運算,當需要改變裡面的數值時可透過向量運算或是new的方式重新賦予座標位置。

Vector3本身可以表示成座標位置也可表示成速度向量,這邊就要看讀者怎麼解讀使用他了,
但在這邊的公式參數幾乎都是以座標位置為主 所以要當成速度向量的話,就需要做公式轉換寫成:
目的位置 = 來源位置 * 速度向量
這樣子就可以讓他在移動時不會到達目標點就停住了。

使用範例:
public class example : MonoBehaviour {
        //目標位置
 public Transform target;
 void Update() {
                //計算兩物體的距離
                float dis = Vector3.Distance(transform.position, traget.position);
                //保持距離,若遠離則追逐目標。
                if(dis >= 5) {
                        //持續注視目標
                        transform.LookAt(target);
                        //持續往目標前進
                        transform.position += transform.forward*Time.deltaTime * 1;
  }
 }
}



Transform.Translate使用時機:平滑移動 (可受碰撞影響),會讓移動看起來更順,因為在移動的過程,自己會去運算補間位移的過程,但移動到位置的時間會比較慢,而且在運算中比較容易耗效能。

函式宣告:
    以自身位置為基準:
    Transform.Translate (translation : Vector3, relativeTo : Space = Space.Self) : void
    Transform.Translate (x : float, y : float, z : float, relativeTo : Space = Space.Self) : void
    translation: 給予移動方向與速度
    relativeTo: 此速度向量是依照哪個座標系 Space.Self or Space.World

    依據目標位置 給予速度向量,設定移動距離
    Transform.Translate (translation : Vector3, relativeTo : Transform) : void
    Transform.Translate (x : float, y : float, z : float, relativeTo : Transform) : void
    translation: 速度向量
    relativeTo: 目標位置

使用範例:
public class example : MonoBehaviour {
 void Update() {
  transform.Translate(Vector3.forward * Time.deltaTime);
  transform.Translate(Vector3.up * Time.deltaTime, Space.World);
 }
}

Transform.Translate本身配合 Transform.Rotate 就可以使用控制角度的方式前進移動,移動會依照目前物件面向的方向一值前進,而我們可以透過Rotate改變他的移動角度。

使用範例:
public class example : MonoBehaviour {
 void Update() {
  transform.Translate(Vector3.forward * Time.deltaTime);
  transform.Rotate(Vector3.up * Time.deltaTime * 50.0f);
 }
}



飛機移動方式

public class OwnFighter : MonoBehaviour
{
    /// <summary>移動速度</summary>
    public float fMoveSpeed = 1.0f;
    /// <summary>旋轉速度</summary>
    public float fRotateSpeed = 5.0f;

    void Update()
    {
        //上下旋轉
        float l_fH = Input.GetAxis("Mouse X") * fRotateSpeed;
        transform.Rotate(Vector3.up * Time.deltaTime * l_fH * 100);
        //左右旋轉
        float l_fV = Input.GetAxis("Mouse Y") * fRotateSpeed;
        transform.Rotate(Vector3.left * Time.deltaTime * l_fV * 100);
        //往前移動
        transform.Translate(Vector3.forward * Time.deltaTime * fMoveSpeed);
    }
}


補充:

有鋼體的話可以用鋼體設定速度的方式讓他自行移動。
l_obj.GetComponent<Rigidbody>().velocity = transform.TransformDirection(Vector3.forward * 10);



以下也開放留言,可以問一些問題,可以再相互討論精進。