2017-05-29 3 views
0

私は現在、Runescape(旧式の学校)に似ていますが、私自身のゲームシステムを使ってグラフィカルにRPGに取り組んでいます。交換可能な装甲システムを持つ最良の方法は何か分かりません。私はhereのようなrunescapeモデルと同様に低ポリゴンモデルを作成し、hereのような武器のランダムなバリエーションを持つ可能性を持ちたいと考えています。キャラクターに互換性のある鎧をする方法(低ポリゴン)

私が理解しているように、まずキャラクターモデルのメッシュを変更するだけです。もう1つは、キャラクターのモデルを作成し、アーマーモデルにボーンウェイトを使用することです。私はここに最初のオプションについての話題が全部あることを知っています(3番目のリンクを作ることができませんでした)forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485/、本当ですか?似たようなことについてのあらゆる議論がこのトピックにつながります。しかし、8歳とUnity 2.0のように...同じ結果を達成するための単純な方法がありますが、とにかく実装できないmasterpromptの疲れた説明を勉強しないでください。そして、第二の方法では、私の使用と技術のためにはあまりにも一般的な、骨重量のための単一のウェブのマニュアルとスクリプトを除いて、私はヒントを見つけることができません。私はいくつかのソリューション(チュートリアル)を何時間も探していましたが、グーグルは4-8歳の同じトピックをポップし続けています...

どのようにして鎧を交換し、これらの問題に関する知識はありますか?ありがとうございました。

答えて

2

だから私は私のプロジェクトでやっていることは(私は基本文字の.blendファイル(リグ、モデル)を複製​​し、私は私がのために服を作りたい体の部分を除いて、メッシュの大部分を除去され、胸/足)。私は頂点が基本メッシュと重複せず、それを保存するように少し引っ張り出します。

次にUnityで保存したばかりのモデルから新しいプレハブを作成します。プレハブの階層は次のようになります。BoneReplacer.csスクリプトを使用した親ゲームオブジェクト - >自分の衣服のスキンメッシュレンダラーを持つ子ゲームオブジェクト。

このプレハブをキャラクタプレハブにドラッグするだけで、このスクリプトのターゲット変数がキャラクタのスキンメッシュレンダラをポイントするようになります。

これはおそらくこれを実行する最善の方法ではありませんが、それは私のために働く、それはあなたの周りにあなたの頭を取得し、よりよい解決策を作成するのに役立ちます。

相続人BoneReplacer.csスクリプト:

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

public class BoneReplacer : MonoBehaviour 
{ 
    public GameObject target; 
    SkinnedMeshRenderer myRenderer; 
    Transform[] newBones; 
    SkinnedMeshRenderer targetRenderer; 
    Dictionary<string, Transform> boneMap = new Dictionary<string, Transform>(); 

    void Start() 
    { 
     target = transform.parent.parent.gameObject; 
     targetRenderer = target.GetComponentInChildren<SkinnedMeshRenderer>(); 

     foreach (Transform _bone in targetRenderer.bones) 
     { 
      boneMap[_bone.gameObject.name] = _bone; 
     } 

     myRenderer = gameObject.GetComponent<SkinnedMeshRenderer>(); 
     newBones = new Transform[myRenderer.bones.Length]; 

     for (int i = 0; i < myRenderer.bones.Length; i++) 
     { 
      GameObject _bone = myRenderer.bones[i].gameObject; 
      if (!boneMap.TryGetValue(_bone.name, out newBones[i])) 
      { 
       Debug.Log("Unable to map bone ~" + _bone.name + "~ to target skeleton!"); 
       break; 
      } 
     } 

     myRenderer.bones = newBones; 
     myRenderer.rootBone = targetRenderer.rootBone; 
    } 
} 
+0

私は同じアプローチを提案するつもりでした。 'break;を' newBones [i] = _bone.transform;に置き換えて、添付されたオブジェクトがターゲットのスケルトンより多くの骨を持つことができるようにすることも考えられます。アタッチされたオブジェクトは、ターゲットのスケルトンが知っていない(必要とする)骨について、静的または手続き型のアニメーションを持つことがあります。 –

+0

ありがとう、本当に便利です! – Fiffe

関連する問題