ドレスアップの原則

フェイスリフトシリーズ:
ドレスの原則探索
ドレスアップの原則ノヴェラ
ドレスアップの実践の原則

コードの再利用とマージ

予備調査原則ドレスアップ、ドレスアップのコアステップは導入が、少年の文字ドレスアップの一種類のみが存在している。この記事では、ドレスアップ男の子と女の子のを考えています。さらに、上記のいくつかの変数の名前が調整され、ターゲットがアバターに変更され、モデルとアバターの読み込み方法が統合されました。実際、男の子と女の子の変化を考えると、主な問題はコードの再利用とマージです。

  • モデルとアバターをロードします。コードを再利用する必要があるため、loadingメソッドでパラメータを指定する必要があります。主にモデル名modelName、avatarName、およびロードおよび保存される変数modelTransとavatarTransがあります。
  • データを保存します。同様に、パラメーター、変数modelTransとavatarTrans、およびパラメーターストレージコンテナーmodelData、avatarDataとhipsが必要です。
  • 着飾る。パラメータコンテナmodelData、avatarDataとhips、変換パーツ名partNameと変換モデルnum。

テスト

上記のコードのテスト作業を完了するには、いくつかのテストユニットを定義する必要があり、男の子または女の子を表す新しいGender変数が追加されます。

  • Start関数で、初期化テストを完了します。
  • 更新機能では、性転換テストとドレスアップテストがそれぞれ完了します。マウスの左ボタンをクリックして性別の切り替えを完了し、マウスの右ボタンをクリックして変更を完了します。
using System.Collections.Generic;
using UnityEngine;


public enum Gender
{
    
    
    Male,
    Female
}

public class AvatarCustomization : MonoBehaviour
{
    
    
    public Gender AvatarGender = Gender.Male;


    private Transform maleModelTrans;
    private Transform maleAvatarTrans;
    private Transform femaleModelTrans;
    private Transform femaleAvatarTrans;

    private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> maleModelData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();
    private Dictionary<string, SkinnedMeshRenderer> maleAvatarData = new Dictionary<string, SkinnedMeshRenderer>();
    private Transform[] maleHips;
    private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> femaleModelData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();
    private Dictionary<string, SkinnedMeshRenderer> femaleAvatarData = new Dictionary<string, SkinnedMeshRenderer>();
    private Transform[] femaleHips;

    private string[,] boyStr = new string[,] {
    
     {
    
     "eyes", "1" }, {
    
     "hair", "1" }, {
    
     "top", "1" }, {
    
     "pants", "1" }, {
    
     "shoes", "1" }, {
    
     "face", "1" } };

    private void Start()
    {
    
    
        LoadModelAndAvatar(out maleModelTrans, out maleAvatarTrans, "MaleModel", "MaleTarget");
        LoadModelAndAvatar(out femaleModelTrans, out femaleAvatarTrans, "FemaleModel", "FemaleTarget");
        SaveData(maleModelTrans,maleAvatarTrans,maleModelData,maleAvatarData,out maleHips);
        SaveData(femaleModelTrans, femaleAvatarTrans, femaleModelData, femaleAvatarData, out femaleHips);
        InitiateAvatar();
    }

    private void Update()
    {
    
    
        if(Input.GetMouseButtonDown(0))
        {
    
    
            if(AvatarGender==Gender.Male)
            {
    
    
                AvatarGender = Gender.Female;
            }
            else
            {
    
    
                AvatarGender = Gender.Male;
            }
            ChangeSex();
        }
        if(Input.GetMouseButtonDown(1))
        {
    
    
            int num = Random.Range(1, 4);
            ChangeAvatar("pants", num.ToString());
            
        }
    }

    void LoadModelAndAvatar(out Transform modelTrans, out Transform avatarTrans, string modelName, string avatarName)
    {
    
    
        GameObject model = GameObject.Instantiate(Resources.Load(modelName)) as GameObject;
        modelTrans = model.transform;
        model.SetActive(false);
        GameObject avatar = GameObject.Instantiate(Resources.Load(avatarName)) as GameObject;
        avatarTrans = avatar.transform;
        avatar.SetActive(false);
    }

    void SaveData(Transform modelTrans, Transform avatarTrans, Dictionary<string,Dictionary<string,SkinnedMeshRenderer>> modelData, 
        Dictionary<string,SkinnedMeshRenderer> avatarData, out Transform[] hips)
    {
    
    
        SkinnedMeshRenderer[] parts = modelTrans.GetComponentsInChildren<SkinnedMeshRenderer>();
        hips = avatarTrans.GetComponentsInChildren<Transform>();
        foreach (SkinnedMeshRenderer part in parts)
        {
    
    
            string[] names = part.name.Split('-');

            if(!modelData.ContainsKey(names[0]))
            {
    
    
                GameObject partGo = new GameObject();
                partGo.name = names[0];
                partGo.transform.SetParent(avatarTrans);
                modelData.Add(names[0], new Dictionary<string, SkinnedMeshRenderer>());
                avatarData.Add(names[0], partGo.AddComponent<SkinnedMeshRenderer>());
            }
            modelData[names[0]].Add(names[1], part);
        }
    }

    void InitiateAvatar()
    {
    
    
        for (int i = 0; i < boyStr.GetLength(0); i++)
        {
    
    
            ChangeStyle(maleModelData, maleAvatarData, maleHips, boyStr[i, 0], boyStr[i, 1]);
        }
        for (int i = 0; i < boyStr.GetLength(0); i++)
        {
    
    
            ChangeStyle(femaleModelData, femaleAvatarData, femaleHips, boyStr[i, 0], boyStr[i, 1]);
        }
        ChangeSex();
        
    }

    void ChangeSex()
    {
    
    
        if (AvatarGender == Gender.Male)
        {
    
    
            maleAvatarTrans.gameObject.SetActive(true);
            femaleAvatarTrans.gameObject.SetActive(false);
        }
        else
        {
    
    
            maleAvatarTrans.gameObject.SetActive(false);
            femaleAvatarTrans.gameObject.SetActive(true);
        }
    }

    void ChangeAvatar(string partName, string num)
    {
    
    
        if (AvatarGender == Gender.Male)
        {
    
    
            ChangeStyle(maleModelData, maleAvatarData, maleHips, partName, num);
        }
        else
        {
    
    
            ChangeStyle(femaleModelData, femaleAvatarData, femaleHips, partName, num);
        }
    }

    void ChangeStyle(Dictionary<string, Dictionary<string,SkinnedMeshRenderer>> modelData,
        Dictionary<string, SkinnedMeshRenderer> avatarData, Transform[] hips, string partName, string num)
    {
    
    
        SkinnedMeshRenderer part = modelData[partName][num];
        List<Transform> bones = new List<Transform>();
        foreach(var trans in part.bones)
        {
    
    
            foreach(var bone in hips)
            {
    
    
                if(bone.name == trans.name)
                {
    
    
                    bones.Add(bone);
                    break;
                }
            }
        }
        avatarData[partName].bones = bones.ToArray();
        avatarData[partName].sharedMesh = part.sharedMesh;
        avatarData[partName].material = part.material;
    }
}

おすすめ

転載: blog.csdn.net/Abecedarian_CLF/article/details/85051686