You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

554 lines
20 KiB

using System.Collections.Generic;
using UnityEngine;
using System.IO;
using MU3;
using System;
using UnityEngine.UI;
public class Main : MonoBehaviour
{
#region var
public GameObject chara;
private GameObject weapon;
private GameObject weaponL;
private GameObject weaponR;
private GameObject attachment;
private RuntimeAnimatorController originAnimator;
private SkinnedMeshRenderer charaFaceRender;
private MotionEffectManager charaMotion;
private int faceOverride = 0;
private string basePath;
public Dictionary<string, List<string>> charaAssetsNames = new Dictionary<string, List<string>>();
public Dictionary<string, List<string>> weaponAssetsNames = new Dictionary<string, List<string>>();
public Dictionary<string, List<string>> attachmentAssetsNames = new Dictionary<string, List<string>>();
public Dictionary<string, string> charaWeapon = new Dictionary<string, string>();
public Dictionary<string, string> attachmentPosition = new Dictionary<string, string>();
#endregion
void Start()
{
basePath = FolderPicker.GetPath();
loadCommonAssets();
loadCharaCSV();
loadWeaponCSV();
loadAttachmentCSV();
GameObject.Find("charaDropdown").GetComponent<Dropdown>().value = 14;
}
#region Init
private void loadCommonAssets()
{
var lines = CSVReader.ReadCSV(Application.streamingAssetsPath + "/data/common.csv");
foreach (var line in lines) AssetBundle.LoadFromFile(basePath + line[0]);
}
private void loadCharaCSV()
{
var options = new List<Dropdown.OptionData>();
var lines = CSVReader.ReadCSV(Application.streamingAssetsPath + "/data/chara.csv");
foreach (var line in lines)
{
charaWeapon[line[0]] = line[2] != string.Empty ? line[2] : null;
var assets = new List<string>();
foreach (var asset in line.GetRange(3, 7))
{
if (asset != string.Empty) assets.Add(asset);
}
charaAssetsNames[line[0]] = assets;
options.Add(new Dropdown.OptionData(line[1]));
}
GameObject.Find("charaDropdown").GetComponent<Dropdown>().AddOptions(options);
}
private void loadWeaponCSV()
{
var options = new List<Dropdown.OptionData>();
var lines = CSVReader.ReadCSV(Application.streamingAssetsPath + "/data/weapon.csv");
foreach (var line in lines)
{
var assets = new List<string>();
foreach (var asset in line.GetRange(2, 4))
{
if (asset != string.Empty) assets.Add(asset);
}
weaponAssetsNames[line[0]] = assets;
options.Add(new Dropdown.OptionData(line[1]));
}
GameObject.Find("weaponLDropdown").GetComponent<Dropdown>().AddOptions(options);
GameObject.Find("weaponRDropdown").GetComponent<Dropdown>().AddOptions(options);
}
private void loadAttachmentCSV()
{
var options = new List<Dropdown.OptionData>();
var lines = CSVReader.ReadCSV(Application.streamingAssetsPath + "/data/attachment.csv");
foreach (var line in lines)
{
var assets = new List<string>();
foreach (var asset in line.GetRange(3, 2))
{
if (asset != string.Empty) assets.Add(asset);
}
attachmentAssetsNames[line[0]] = assets;
attachmentPosition[line[0]] = line[2];
options.Add(new Dropdown.OptionData(line[1]));
}
GameObject.Find("attachmentDropdown").GetComponent<Dropdown>().AddOptions(options);
}
#endregion
#region Chara
public void removeChara()
{
if (attachment != null) Destroy(attachment);
}
public void loadChara(string charaName)
{
removeChara();
removeWeapon();
removeAttachment();
var assetNames = new List<string>();
charaAssetsNames.TryGetValue(charaName, out assetNames);
loadPrefab(charaName, assetNames, ref chara);
if (charaWeapon[charaName] != null) loadWeapon(charaWeapon[charaName]);
originAnimator = chara.GetComponent<Animator>().runtimeAnimatorController;
charaFaceRender = chara.GetComponentsInChildren<SkinnedMeshRenderer>()[1];
charaMotion = chara.GetComponent<MotionEffectManager>();
charaMotion.isAttached = true;
charaMotion.attachmentMotionIndex = 0;
charaMotion.initialize();
}
#endregion
# region Weapon
public void removeWeapon()
{
if (weapon != null) Destroy(weapon);
if (weaponL != null) Destroy(weaponL);
if (weaponR != null) Destroy(weaponR);
}
public void loadWeapon(string weaponName)
{
removeWeapon();
var assetNames = new List<string>();
weaponAssetsNames.TryGetValue(weaponName, out assetNames);
loadPrefab(weaponName, assetNames, ref weapon);
}
public void loadWeaponL(string weaponName)
{
if (weapon != null) Destroy(weapon);
var assetNames = new List<string>();
weaponAssetsNames.TryGetValue(weaponName, out assetNames);
loadPrefab(weaponName, assetNames, ref weaponL);
Transform parent = Utils.findChildRecursive(chara.transform, "pos_l_weapon");
if (parent != null)
{
for (int i = parent.childCount -1; i >=0 ; i--)
Destroy(parent.GetChild(i).gameObject);
Transform childL = Utils.findChildRecursive(weaponL.transform, "l_weapon");
Transform childR = Utils.findChildRecursive(weaponL.transform, "r_weapon");
removeWeaponButtonListener("L");
if (childL != null)
{
addWeaponButtonListener(childL.gameObject.AddComponent<RemoveAnimationTransfrom>(), "L");
childL.SetParent(parent, true);
}
if (childR != null)
{
addWeaponButtonListener(childR.gameObject.AddComponent<RemoveAnimationTransfrom>(), "L");
childR.SetParent(parent, true);
}
}
}
public void loadWeaponR(string weaponName)
{
if (weapon != null) Destroy(weapon);
var assetNames = new List<string>();
weaponAssetsNames.TryGetValue(weaponName, out assetNames);
loadPrefab(weaponName, assetNames, ref weaponR);
Transform parent = Utils.findChildRecursive(chara.transform, "pos_r_weapon");
if (parent != null)
{
for (int i = parent.childCount -1; i >=0 ; i--)
Destroy(parent.GetChild(i).gameObject);
Transform childL = Utils.findChildRecursive(weaponR.transform, "l_weapon");
Transform childR = Utils.findChildRecursive(weaponR.transform, "r_weapon");
removeWeaponButtonListener("R");
if (childL != null)
{
addWeaponButtonListener(childL.gameObject.AddComponent<RemoveAnimationTransfrom>(), "R");
childL.SetParent(parent, true);
}
if (childR != null)
{
addWeaponButtonListener(childR.gameObject.AddComponent<RemoveAnimationTransfrom>(), "R");
childR.SetParent(parent, true);
}
}
}
#endregion
#region Attachment
public void removeAttachment()
{
if (attachment != null) Destroy(attachment);
}
public void loadAttachment(string attachmentName)
{
var assetNames = new List<string>();
attachmentAssetsNames.TryGetValue(attachmentName, out assetNames);
if (attachmentPosition[attachmentName] == "右手")
{
loadPrefab(attachmentName, assetNames, ref weaponR);
Transform parent = Utils.findChildRecursive(chara.transform, "pos_r_weapon");
if (parent != null)
{
for (int i = parent.childCount -1; i >=0 ; i--)
Destroy(parent.GetChild(i).gameObject);
weaponR.transform.SetParent(parent, false);
}
}
else
{
removeAttachment();
loadPrefab(attachmentName, assetNames, ref attachment);
Transform parent = Utils.findChildRecursive(chara.transform, "spine_a");
if (parent != null) attachment.transform.SetParent(parent, false);
attachment.transform.rotation = attachment.transform.localRotation;
if (attachmentName == "at_020102")
{
attachment.transform.localPosition = new Vector3(0, 0.1f, 0);
attachment.transform.localRotation = Quaternion.Euler(0, -7f, -30);
}
}
}
#endregion
#region Animator
public void loadAnimator(int i)
{
if (weapon != null) Destroy(weapon);
if (i == 0)
{
chara.GetComponent<Animator>().runtimeAnimatorController = originAnimator;
}
else
{
string[] names = {
"",
"ch_000000_01_002",
"ch_000000_01_003",
"ch_000000_02_002",
"ch_000000_02_003",
"ch_000000_03_002",
"ch_000000_03_003",
"ch_000000_04_002",
"ch_000000_04_003",
"ch_000000_05_002",
"ch_000000_05_003",
"ch_000000_06_002",
"ch_000000_06_003",
};
var animatorName = names[i];
var bundle = AssetBundle.LoadFromFile(basePath + animatorName);
var aoc = bundle.LoadAsset<AnimatorOverrideController>(animatorName);
chara.GetComponent<Animator>().runtimeAnimatorController = aoc;
bundle.Unload(false);
}
}
#endregion
#region Face
public void setFace(int i)
{
GameObject.Find("faceDropdown").GetComponent<Dropdown>().value = i;
faceOverride = i;
}
#endregion
#region Model Internal
void removeWeaponButtonListener(string LR)
{
GameObject.Find(string.Format("weapon{0}x", LR)).GetComponent<Button>().onClick.RemoveAllListeners();
GameObject.Find(string.Format("weapon{0}y", LR)).GetComponent<Button>().onClick.RemoveAllListeners();
GameObject.Find(string.Format("weapon{0}z", LR)).GetComponent<Button>().onClick.RemoveAllListeners();
GameObject.Find(string.Format("weapon{0}p", LR)).GetComponent<Button>().onClick.RemoveAllListeners();
GameObject.Find(string.Format("weapon{0}m", LR)).GetComponent<Button>().onClick.RemoveAllListeners();
}
void addWeaponButtonListener(RemoveAnimationTransfrom rat, string LR)
{
GameObject.Find(string.Format("weapon{0}x", LR)).GetComponent<Button>().onClick.AddListener(rat.xReverse);
GameObject.Find(string.Format("weapon{0}y", LR)).GetComponent<Button>().onClick.AddListener(rat.yReverse);
GameObject.Find(string.Format("weapon{0}z", LR)).GetComponent<Button>().onClick.AddListener(rat.zReverse);
GameObject.Find(string.Format("weapon{0}p", LR)).GetComponent<Button>().onClick.AddListener(rat.zPlus);
GameObject.Find(string.Format("weapon{0}m", LR)).GetComponent<Button>().onClick.AddListener(rat.zMinus);
}
void loadPrefab(string prefabName, List<string> assetNames, ref GameObject model)
{
if (model != null) Destroy(model);
List<AssetBundle> bundles = new List<AssetBundle>();
foreach (var assetName in assetNames)
{
var assetPath = basePath + assetName;
if (File.Exists(assetPath))
{
var bundle = AssetBundle.LoadFromFile(assetPath);
bundles.Add(bundle);
}
}
var prefabAssetPath = basePath + prefabName;
if (File.Exists(prefabAssetPath))
{
var bundle = AssetBundle.LoadFromFile(prefabAssetPath);
bundles.Add(bundle);
model = (GameObject)Instantiate(bundle.LoadAsset(prefabName));
}
Animator animator = model.GetComponent<Animator>();
if (animator) animator.cullingMode = AnimatorCullingMode.AlwaysAnimate;
foreach (var bundle in bundles) bundle.Unload(false);
}
#endregion
#region Action
public void setState(int i)
{
setTrigger("EventStep");
if (i == 6) removeWeapon();
if (i == 2 || i == 3) rotate180();
else rotate0();
SetInteger("State", i);
}
public void setRoom(int i)
{
setState(6);
string[] names = {
"RoomAwake",
"RoomPresent", // not implement
"RoomFavorite",
"RoomJoy",
"RoomFaint"
};
setTrigger(names[i]);
}
public void setTurn(float i)
{
setState(1);
setFloat("Turn", i);
}
public void setDamageScale(float i)
{
setState(1);
setFloat("Damage_Scale", i);
}
public void setDamage()
{
setState(1);
setTrigger("Damage");
}
public void setHolding(bool i)
{
setState(1);
setBool("Holding", i);
}
public void setAttack(int i)
{
setState(1);
if (i == 1 || i == 2 || i == 3) setFace(1);
//if (i == 0 || i == 1 || i == 2 || i == 3) charaMotion.TriggerEffect("StartEffect_attack_a_001");
string[] names = {
"Attack_A",
"Attack_A_002",
"Attack_A_003",
"Attack_A_004",
"Attack_B"
};
setTrigger(names[i]);
}
public void setBattleStartBoss()
{
rotate180();
setTrigger("BattleStartBoss");
setTrigger("EventStep");
}
public void setBattleStartPlayer()
{
rotate180();
setTrigger("BattleStartPlayer");
setTrigger("EventStep");
Invoke("EventStep", 0.2f);
//Invoke("EventStep", 5f);
}
public void setSpeed(float value)
{
if (chara.GetComponent<Animator>() != null)
chara.GetComponent<Animator>().speed = value;
if (weapon && weapon.GetComponent<Animator>() != null)
weapon.GetComponent<Animator>().speed = value;
if (weaponL && weaponL.GetComponent<Animator>() != null)
weaponL.GetComponent<Animator>().speed = value;
if (weaponR && weaponR.GetComponent<Animator>() != null)
weaponR.GetComponent<Animator>().speed = value;
GameObject.Find("speedinput").GetComponent<InputField>().text = String.Format("{0:0.00}", value);
}
#endregion
#region Action Internal
void setTrigger(string triggerName)
{
if (chara.GetComponent<Animator>() != null)
chara.GetComponent<Animator>().SetTrigger(Animator.StringToHash(triggerName));
if (weapon && weapon.GetComponent<Animator>() != null)
weapon.GetComponent<Animator>().SetTrigger(Animator.StringToHash(triggerName));
if (weaponL && weaponL.GetComponent<Animator>() != null)
weaponL.GetComponent<Animator>().SetTrigger(Animator.StringToHash(triggerName));
if (weaponR && weaponR.GetComponent<Animator>() != null)
weaponR.GetComponent<Animator>().SetTrigger(Animator.StringToHash(triggerName));
}
void SetInteger(string triggerName, int value)
{
if (chara.GetComponent<Animator>() != null)
chara.GetComponent<Animator>().SetInteger(Animator.StringToHash(triggerName), value);
if (weapon && weapon.GetComponent<Animator>() != null)
weapon.GetComponent<Animator>().SetInteger(Animator.StringToHash(triggerName), value);
if (weaponL && weaponL.GetComponent<Animator>() != null)
weaponL.GetComponent<Animator>().SetInteger(Animator.StringToHash(triggerName), value);
if (weaponR && weaponR.GetComponent<Animator>() != null)
weaponR.GetComponent<Animator>().SetInteger(Animator.StringToHash(triggerName), value);
}
void setFloat(string triggerName, float value)
{
if (chara.GetComponent<Animator>() != null)
chara.GetComponent<Animator>().SetFloat(Animator.StringToHash(triggerName), value);
if (weapon && weapon.GetComponent<Animator>() != null)
weapon.GetComponent<Animator>().SetFloat(Animator.StringToHash(triggerName), value);
if (weaponL && weaponL.GetComponent<Animator>() != null)
weaponL.GetComponent<Animator>().SetFloat(Animator.StringToHash(triggerName), value);
if (weaponR && weaponR.GetComponent<Animator>() != null)
weaponR.GetComponent<Animator>().SetFloat(Animator.StringToHash(triggerName), value);
}
void setBool(string triggerName, bool value)
{
if (chara.GetComponent<Animator>() != null)
chara.GetComponent<Animator>().SetBool(Animator.StringToHash(triggerName), value);
if (weapon && weapon.GetComponent<Animator>() != null)
weapon.GetComponent<Animator>().SetBool(Animator.StringToHash(triggerName), value);
if (weaponL && weaponL.GetComponent<Animator>() != null)
weaponL.GetComponent<Animator>().SetBool(Animator.StringToHash(triggerName), value);
if (weaponR && weaponR.GetComponent<Animator>() != null)
weaponR.GetComponent<Animator>().SetBool(Animator.StringToHash(triggerName), value);
}
void EventStep()
{
setTrigger("EventStep");
}
void rotate180()
{
chara.transform.rotation = Quaternion.Euler(0, 180, 0);
if (weapon != null) weapon.transform.rotation = Quaternion.Euler(0, 180, 0);
if (attachment != null) attachment.transform.rotation = Quaternion.Euler(0, 180, 0);
}
void rotate0()
{
chara.transform.rotation = Quaternion.Euler(0, 0, 0);
if (weapon != null) weapon.transform.rotation = Quaternion.Euler(0, 0, 0);
if (attachment != null) attachment.transform.rotation = Quaternion.Euler(0, 0, 0);
}
#endregion
void Update()
{
if (Input.GetKeyDown(KeyCode.Alpha1)) setState(1);
else if (Input.GetKeyDown(KeyCode.Alpha2)) setState(2);
else if (Input.GetKeyDown(KeyCode.Alpha3)) setState(3);
else if (Input.GetKeyDown(KeyCode.Alpha4)) setState(4);
else if (Input.GetKeyDown(KeyCode.Alpha5)) setState(5);
else if (Input.GetKeyDown(KeyCode.Alpha6)) setState(6);
else if (Input.GetKeyDown(KeyCode.V)) setRoom(0);
else if (Input.GetKeyDown(KeyCode.B)) setRoom(2);
else if (Input.GetKeyDown(KeyCode.N)) setRoom(3);
else if (Input.GetKeyDown(KeyCode.M)) setRoom(4);
else if (Input.GetKeyDown(KeyCode.A)) setAttack(0);
else if (Input.GetKeyDown(KeyCode.S)) setAttack(1);
else if (Input.GetKeyDown(KeyCode.D)) setAttack(2);
else if (Input.GetKeyDown(KeyCode.F)) setAttack(3);
else if (Input.GetKeyDown(KeyCode.G)) setAttack(4);
else if (Input.GetKeyDown(KeyCode.X)) setDamage();
else if (Input.GetKeyDown(KeyCode.J)) setBattleStartPlayer();
else if (Input.GetKeyDown(KeyCode.K)) setBattleStartBoss();
else if (Input.GetKeyDown(KeyCode.Space))
GameObject.Find("stopbutton").GetComponent<Button>().onClick.Invoke();
else if (Input.GetKeyDown(KeyCode.Z))
{
Toggle t = GameObject.Find("holdingtoggle").GetComponent<Toggle>();
t.isOn = !t.isOn;
}
// if (Input.GetMouseButtonDown(0)) {}
}
void LateUpdate()
{
if (faceOverride != 0)
{
float u = (faceOverride == 1 || faceOverride == 3 ? 0f : 0.5f);
float v = (faceOverride == 1 || faceOverride == 2 ? 0f : 0.5f);
MaterialPropertyBlock block = new MaterialPropertyBlock();
charaFaceRender.GetPropertyBlock(block);
block.SetVector("_DecalTex_ST", new Vector4(1f, 1f, u, v));
charaFaceRender.SetPropertyBlock(block);
}
}
}