2018-09-20 metaII 單手Scale

// Copyright ? 2018, Meta Company. All rights reserved.

//

// Redistribution and use of this software (the "Software") in binary form, without modification, is

// permitted provided that the following conditions are met:

//

// 1.? ? ? Redistributions of the unmodified Software in binary form must reproduce the above

//? ? ? ? copyright notice, this list of conditions and the following disclaimer in the

//? ? ? ? documentation and/or other materials provided with the distribution.

// 2.? ? ? The name of Meta Company (“Meta”) may not be used to endorse or promote products derived

//? ? ? ? from this Software without specific prior written permission from Meta.

// 3.? ? ? LIMITATION TO META PLATFORM: Use of the Software is limited to use on or in connection

//? ? ? ? with Meta-branded devices or Meta-branded software development kits.? For example, a bona

//? ? ? ? fide recipient of the Software may incorporate an unmodified binary version of the

//? ? ? ? Software into an application limited to use on or in connection with a Meta-branded

//? ? ? ? device, while he or she may not incorporate an unmodified binary version of the Software

//? ? ? ? into an application designed or offered for use on a non-Meta-branded device.

//

// For the sake of clarity, the Software may not be redistributed under any circumstances in source

// code form, or in the form of modified binary code – and nothing in this License shall be construed

// to permit such redistribution.

//

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,

// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A

// PARTICULAR PURPOSE ARE DISCLAIMED.? IN NO EVENT SHALL META COMPANY BE LIABLE FOR ANY DIRECT,

// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS; OR BUSINESS

// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

using Meta.Extensions;

using UnityEngine;

namespace Meta

{

? ? /// <summary>

? ? /// Interaction to scale model by placing two hands into the model and grabbing.

? ? /// </summary>

? ? [AddComponentMenu("Meta/Interaction/TwoHandGrabScaleInteraction")]

? ? public class TwoHandGrabScaleInteraction : TwoHandInteraction

? ? {

? ? ? ? /// <summary>

? ? ? ? /// Minimum scale

? ? ? ? /// </summary>

? ? ? ? [SerializeField]

? ? ? ? private Vector2 _minSize = new Vector2(.3f, .3f);

? ? ? ? /// <summary>

? ? ? ? /// Maximum scale

? ? ? ? /// </summary>

? ? ? ? [SerializeField]

? ? ? ? private Vector2 _maxSize = new Vector2(2, 2);

? ? ? ? public GameObject bottomPos;

? ? ? ? /// <summary>

? ? ? ? /// Whether to size delta for the TargetTransform should be changed. If false, the local scale will be used.

? ? ? ? /// </summary>

? ? ? ? [SerializeField]

? ? ? ? private bool _scaleSizeDelta = false;

? ? ? ? [SerializeField]

? ? ? ? private Vector3UnityEvent _scaleChanged = new Vector3UnityEvent();

? ? ? ? [Tooltip("Make objects scale exponentially using a gamma scale power rather than linearly")]

? ? ? ? [SerializeField]

? ? ? ? private bool _exponentialScaling = false;

? ? ? ? public new Vector3 newScaleP;

? ? ? ? public new Vector3 newCenterPos;

? ? ? ? public float localScaleY;

? ? ? ? private float _priorDistance;

? ? ? ? private RectTransform _rectTransform;

? ? ? ? private const float _gammaScalePower = 1.4f;

? ? ? ? /// <summary>

? ? ? ? /// Minimum scale

? ? ? ? /// </summary>

? ? ? ? public Vector2 MinSize

? ? ? ? {

? ? ? ? ? ? get { return _minSize; }

? ? ? ? ? ? set { _minSize = value; }

? ? ? ? }

? ? ? ? /// <summary>

? ? ? ? /// Maximum scale

? ? ? ? /// </summary>

? ? ? ? public Vector2 MaxSize

? ? ? ? {

? ? ? ? ? ? get { return _maxSize; }

? ? ? ? ? ? set { _maxSize = value; }

? ? ? ? }

? ? ? ? public Vector3UnityEvent ScaleChanged

? ? ? ? {

? ? ? ? ? ? get { return _scaleChanged; }

? ? ? ? }

? ? ? ? protected override void Engage()

? ? ? ? {

? ? ? ? ? ? _priorDistance = Vector3.Distance(FirstGrabbingHand.transform.position,SecondGrabbingHand.transform.position);

? ? ? ? ? ? PrepareRigidbodyForInteraction();

? ? ? ? ? ? base.Engage();

? ? ? ? }

? ? ? ? protected override void Disengage()

? ? ? ? {

? ? ? ? ? ? RestoreRigidbodySettingsAfterInteraction();

? ? ? ? ? ? base.Disengage();

? ? ? ? }

? ? ? ? protected override void Manipulate()

? ? ? ? {

? ? ? ? ? ? newCenterPos = TargetTransform.position;

? ? ? ? ? ? newCenterPos.y = (FirstGrabbingHand.transform.position.y + bottomPos.transform.position.y) / 2f;

? ? ? ? ? ? Vector3 center = newCenterPos;

? ? ? ? ? ? //(FirstGrabbingHand.transform.position + SecondGrabbingHand.transform.position) / 2f;

? ? ? ? ? ? Vector3 offset = Vector3.zero;

? ? ? ? ? ? //TargetTransform.position - center;

? ? ? ? ? ? float currentDistance = Vector3.Distance(FirstGrabbingHand.transform.position,

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? SecondGrabbingHand.transform.position);

? ? ? ? ? ? float multiplier = currentDistance / _priorDistance;

? ? ? ? ? ? multiplier = Mathf.Clamp(multiplier, .5f, 1.5f);

? ? ? ? ? ? if (_exponentialScaling)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? multiplier = Mathf.Pow(multiplier, _gammaScalePower);

? ? ? ? ? ? }

? ? ? ? ? ? RectTransform rectTransform = TargetTransform as RectTransform;

? ? ? ? ? ? if (rectTransform != null && _scaleSizeDelta)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Vector2 newSize = rectTransform.sizeDelta * multiplier;

? ? ? ? ? ? ? ? if (newSize.IsNaN())

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? return;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (newSize.x < _maxSize.x && newSize.y < _maxSize.y && newSize.x > _minSize.x && newSize.y > _minSize.y)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? rectTransform.sizeDelta = newSize;

? ? ? ? ? ? ? ? ? ? OnScaleChanged(newSize);

? ? ? ? ? ? ? ? ? ? Move(center + (offset * multiplier));

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? else

? ? ? ? ? ? {

? ? ? ? ? ? ? ? Vector3 newScale = TargetTransform.localScale * multiplier;

? ? ? ? ? ? ? ? if (newScale.IsNaN())

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? return;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? if (newScale.x < _maxSize.x && newScale.y < _maxSize.y && newScale.x > _minSize.x && newScale.y > _minSize.y)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? newScaleP = TargetTransform.localScale;

? ? ? ? ? ? ? ? ? ? newScaleP.y = newScale.y;

? ? ? ? ? ? ? ? ? ? TargetTransform.localScale = newScaleP;

? ? ? ? ? ? ? ? ? ? OnScaleChanged(newScale);

? ? ? ? ? ? ? ? ? ? Move(center + (offset * multiplier));

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? _priorDistance = currentDistance;

? ? ? ? }

? ? ? ? private void OnScaleChanged(Vector3 scale)

? ? ? ? {

? ? ? ? ? ? _scaleChanged.Invoke(scale);

? ? ? ? }


? ? }


}




// Copyright ? 2018, Meta Company. All rights reserved.

//

// Redistribution and use of this software (the "Software") in binary form, without modification, is

// permitted provided that the following conditions are met:

//

// 1.? ? ? Redistributions of the unmodified Software in binary form must reproduce the above

//? ? ? ? copyright notice, this list of conditions and the following disclaimer in the

//? ? ? ? documentation and/or other materials provided with the distribution.

// 2.? ? ? The name of Meta Company (“Meta”) may not be used to endorse or promote products derived

//? ? ? ? from this Software without specific prior written permission from Meta.

// 3.? ? ? LIMITATION TO META PLATFORM: Use of the Software is limited to use on or in connection

//? ? ? ? with Meta-branded devices or Meta-branded software development kits.? For example, a bona

//? ? ? ? fide recipient of the Software may incorporate an unmodified binary version of the

//? ? ? ? Software into an application limited to use on or in connection with a Meta-branded

//? ? ? ? device, while he or she may not incorporate an unmodified binary version of the Software

//? ? ? ? into an application designed or offered for use on a non-Meta-branded device.

//

// For the sake of clarity, the Software may not be redistributed under any circumstances in source

// code form, or in the form of modified binary code – and nothing in this License shall be construed

// to permit such redistribution.

//

// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,

// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A

// PARTICULAR PURPOSE ARE DISCLAIMED.? IN NO EVENT SHALL META COMPANY BE LIABLE FOR ANY DIRECT,

// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,

// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA OR PROFITS; OR BUSINESS

// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT

// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS

// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

using Meta.HandInput;

using Meta.Extensions;

using UnityEngine;

namespace Meta

{

? ? /// <summary>

? ? /// Interaction to grab the model to translate its position.

? ? /// </summary>

? ? [AddComponentMenu("Meta/Interaction/GrabInteraction")]

? ? public class GrabInteraction : Interaction

? ? {

? ? ? ? private HandFeature _handFeature;

? ? ? ? public GameObject bottomPosition;

? ? ? ? public Vector3 newCenterPos;

? ? ? ? private float _PriorDistance;

? ? ? ? public Vector3 newScaleP;

? ? ? ? private Vector3UnityEvent _scaleChanged = new Vector3UnityEvent();

? ? ? ? private Vector3 _localOffset;

? ? ? ? protected override bool CanEngage(Hand handProxy)

? ? ? ? {

? ? ? ? ? ? return GrabbingHands.Count == 1;

? ? ? ? }

? ? ? ? protected override void Engage()

? ? ? ? {

? ? ? ? ? ? _handFeature = GrabbingHands[0];

? ? ? ? ? ? PrepareRigidbodyForInteraction();

? ? ? ? ? ? _PriorDistance = Vector3.Distance(_handFeature.transform.position, bottomPosition.transform.position);

? ? ? ? ? ? // Store the offset of the object local to the hand feature.? This will be used to keep the object at the same distance from the hand when being moved.


? ? ? ? ? ? SetHandOffsets();

? ? ? ? }

? ? ? ? public Vector3UnityEvent ScaleChanged

? ? ? ? {

? ? ? ? ? ? get { return _scaleChanged; }

? ? ? ? }

? ? ? ? protected override bool CanDisengage(Hand handProxy)

? ? ? ? {

? ? ? ? ? ? if (_handFeature != null && handProxy.Palm == _handFeature)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? foreach (var hand in GrabbingHands)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? if (hand != _handFeature)

? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? _handFeature = hand;

? ? ? ? ? ? ? ? ? ? ? ? SetHandOffsets();

? ? ? ? ? ? ? ? ? ? ? ? return false;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? return true;

? ? ? ? ? ? }

? ? ? ? ? ? return false;

? ? ? ? }

? ? ? ? protected override void Disengage()

? ? ? ? {

? ? ? ? ? ? Manipulate();

? ? ? ? ? ? RestoreRigidbodySettingsAfterInteraction();

? ? ? ? ? ? _handFeature = null;

? ? ? ? }

? ? ? ? protected override void Manipulate()

? ? ? ? {

? ? ? ? ? ? Move((TransformedHandPos() + bottomPosition.transform.position) / 2f);

? ? ? ? ? ? newCenterPos = TargetTransform.position;

? ? ? ? ? ? newCenterPos.y = (_handFeature.transform.position.y + bottomPosition.transform.position.y) / 2f;

? ? ? ? ? ? float currentDistance = Vector3.Distance(_handFeature.transform.position, bottomPosition.transform.position);

? ? ? ? ? ? float multiplier = currentDistance / _PriorDistance;

? ? ? ? ? ? multiplier = Mathf.Clamp(multiplier, 0.5f, 1.5f);

? ? ? ? ? ? Vector3 newScale = TargetTransform.localScale * multiplier;

? ? ? ? ? ? newScaleP = TargetTransform.localScale;

? ? ? ? ? ? newScaleP.y = newScale.y;

? ? ? ? ? ? TargetTransform.localScale = newScaleP;

? ? ? ? ? ? OnScaleChanged(newScale);

? ? ? ? ? ? //Vector3 center = newCenterPos;

? ? ? ? }

? ? ? ? private Vector3 TransformedHandPos()

? ? ? ? {

? ? ? ? ? ? // This complements obtaining the offset - used to convert back to world space.

? ? ? ? ? ? Vector3 offset = _handFeature.transform.TransformDirection(_localOffset);

? ? ? ? ? ? Vector3 grabPosition = _handFeature.transform.position + offset;

? ? ? ? ? ? return grabPosition;

? ? ? ? }

? ? ? ? private void SetHandOffsets()

? ? ? ? {

? ? ? ? ? ? _localOffset = _handFeature.transform.InverseTransformDirection(TargetTransform.position - _handFeature.Position);

? ? ? ? ? ? SetGrabOffset(TransformedHandPos());

? ? ? ? }

? ? ? ? private void OnScaleChanged(Vector3 scale)

? ? ? ? {

? ? ? ? ? ? _scaleChanged.Invoke(scale);

? ? ? ? }

? ? }

}




using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class ScaleController : MonoBehaviour {

? ? public GameObject cube;

? ? public GameObject top;

? ? public GameObject bottom;

? ? public Vector3 newScale;

? ? public float defaultDistance;


// Use this for initialization

void Start () {

? ? ? ? defaultDistance = Vector3.Distance(top.transform.position,? bottom.transform.position);

}

// Update is called once per frame

void Update () {

? ? ? ? float currentDistance = Vector3.Distance(top.transform.position, bottom.transform.position);

? ? ? ? float multiplier = currentDistance / defaultDistance;

? ? ? ? multiplier = Mathf.Clamp(multiplier, 0.5f, 1.5f);

? ? ? ? cube.transform.localScale = newScale;



? ? }

}





using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class TestTarget : MonoBehaviour {

? ? public GameObject cube;

? ? public UnityEngine.AI.NavMeshSurface naveMeshSurface;

? ? public bool hasPath;

? ? private UnityEngine.AI.NavMeshAgent agent;

? ? //UnityEngine.AI.NavMeshPath path;

// Use this for initialization

void Start () {

? ? ? ? agent = GetComponent<UnityEngine.AI.NavMeshAgent>();

? ? ? ? Debug.Log(hasPath);

}

// Update is called once per frame

void Update () {

? ? ? ? GetComponent<UnityEngine.AI.NavMeshAgent>().destination = cube.transform.position;

? ? ? ? if(Input.GetKeyDown(KeyCode.A))

? ? ? ? {

? ? ? ? ? ? Debug.Log("A");

? ? ? ? ? ? naveMeshSurface.BuildNavMesh();

? ? ? ? }

? ? ? ? //hasPath = agent.CalculatePath(cube.transform.position, path);

? ? ? ? if(agent.hasPath == true)

? ? ? ? {

? ? ? ? ? ? Debug.Log("A");

? ? ? ? }

? ? ? ? else

? ? ? ? {

? ? ? ? ? ? UnityEngine.AI.NavMeshHit navHit;

? ? ? ? ? ? if (agent.Raycast(cube.transform.position, out navHit))

? ? ? ? ? ? {

? ? ? ? ? ? ? ? agent.SetDestination(navHit.position);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? //if (agent.pathStatus == UnityEngine.AI.NavMeshPathStatus.PathComplete)

? ? ? ? //{

? ? ? ? //? ? Debug.Log("A");

? ? ? ? //}

? ? ? ? //else if (agent.pathStatus == UnityEngine.AI.NavMeshPathStatus.PathInvalid)

? ? ? ? //{

? ? ? ? //? ? Debug.Log("B");

? ? ? ? //}

? ? ? ? //else if (agent.pathStatus == UnityEngine.AI.NavMeshPathStatus.PathPartial)

? ? ? ? //{

? ? ? ? //? ? Debug.Log("C");

? ? ? ? //}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肴熏,更是在濱河造成了極大的恐慌逗栽,老刑警劉巖誊爹,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芬首,死亡現(xiàn)場離奇詭異悦即,居然都是意外死亡吮成,警方通過查閱死者的電腦和手機橱乱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來粱甫,“玉大人泳叠,你說我怎么就攤上這事〔柘” “怎么了析二?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長节预。 經(jīng)常有香客問我,道長属韧,這世上最難降的妖魔是什么安拟? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宵喂,結(jié)果婚禮上糠赦,老公的妹妹穿的比我還像新娘。我一直安慰自己锅棕,他們只是感情好拙泽,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裸燎,像睡著了一般顾瞻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上德绿,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天荷荤,我揣著相機與錄音,去河邊找鬼移稳。 笑死蕴纳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的个粱。 我是一名探鬼主播古毛,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼都许!你這毒婦竟也來了稻薇?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梭稚,失蹤者是張志新(化名)和其女友劉穎颖低,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弧烤,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡忱屑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年蹬敲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莺戒。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡伴嗡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出从铲,到底是詐尸還是另有隱情瘪校,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布名段,位于F島的核電站阱扬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏伸辟。R本人自食惡果不足惜麻惶,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望信夫。 院中可真熱鬧窃蹋,春花似錦、人聲如沸静稻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽振湾。三九已至杀迹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間恰梢,已是汗流浹背佛南。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嵌言,地道東北人嗅回。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像摧茴,于是被迫代替她去往敵國和親绵载。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 最高人民法院民一庭意見 在審理同居關(guān)系糾紛時苛白,對當事人同居期間所得的工資娃豹、獎金和生產(chǎn)、經(jīng)營的收益以及因繼承购裙、贈與等...
    Sunshinelawyer閱讀 163評論 0 0
  • 蒙克博物館(Munch museet)這座博物館是為了紀念挪威著名畫家愛德華?蒙克而建懂版。館內(nèi)收藏的作品包括傳世名作...
    慕溪北歐旅游閱讀 601評論 0 3
  • 其實我一直都沒有寫讀書筆記的習慣,但是2016年躏率,受到很多人共同的影響躯畴,主要是一些公眾號一些知乎回答的成功人士的諄...
    袋鼠的尾巴閱讀 305評論 0 2