Browse Source

Merge pull request #510 from lealeelu/simplescript

Create Conversation Function in LuaUtils
master
Chris Gregan 9 years ago committed by GitHub
parent
commit
b0c500810d
  1. 25
      Assets/Fungus/Narrative/Scripts/Character.cs
  2. 7
      Assets/Fungus/Narrative/Scripts/DialogInput.cs
  3. 39
      Assets/Fungus/Narrative/Scripts/PortraitController.cs
  4. 21
      Assets/Fungus/Narrative/Scripts/Stage.cs
  5. 7
      Assets/Fungus/Thirdparty/FungusLua/Resources/Lua/fungus.txt
  6. 219
      Assets/Fungus/Thirdparty/FungusLua/Scripts/ConversationManager.cs
  7. 12
      Assets/Fungus/Thirdparty/FungusLua/Scripts/ConversationManager.cs.meta
  8. 13
      Assets/Fungus/Thirdparty/FungusLua/Scripts/LuaUtils.cs
  9. 167
      Assets/FungusExamples/FungusLua/Narrative/PortaitControlExample.unity

25
Assets/Fungus/Narrative/Scripts/Character.cs

@ -21,7 +21,7 @@ namespace Fungus
public Sprite profileSprite;
public List<Sprite> portraits;
public FacingDirection portraitsFace;
public PortraitState state;
public PortraitState state = new PortraitState();
[Tooltip("Sets the active Say dialog with a reference to a Say Dialog object in the scene. All story text will now display using this Say Dialog.")]
public SayDialog setSayDialog;
@ -59,30 +59,33 @@ namespace Fungus
nameText = standardText;
}
public bool NameStartsWith(string matchString)
{
return name.StartsWith(matchString, true, System.Globalization.CultureInfo.CurrentCulture)
|| nameText.StartsWith(matchString, true, System.Globalization.CultureInfo.CurrentCulture);
}
/// <summary>
/// Looks for a portrait by name on a character
/// If none is found, give a warning and return a blank sprite
/// </summary>
/// <param name="portrait_string"></param>
/// <returns>Character portrait sprite</returns>
public virtual Sprite GetPortrait(string portrait_string)
public virtual Sprite GetPortrait(string portrait_string)
{
if (portrait_string == null)
if (String.IsNullOrEmpty(portrait_string))
{
Debug.LogWarning("No portrait specifed for character " + name);
//Would be nice to have a <picture missing> sprite show up instead
return new Sprite();
return null;
}
foreach (Sprite portrait in portraits)
for (int i = 0; i < portraits.Count; i++)
{
if ( String.Compare(portrait.name, portrait_string, true) == 0)
if ( String.Compare(portraits[i].name, portrait_string, true) == 0)
{
return portrait;
return portraits[i];
}
}
Debug.LogWarning("No portrait \"" + portrait_string + "\" found for character \"" + name + "\"");
return new Sprite();
return null;
}
public virtual string GetDescription()

7
Assets/Fungus/Narrative/Scripts/DialogInput.cs

@ -82,6 +82,11 @@ namespace Fungus
protected virtual void Update()
{
if (EventSystem.current == null)
{
return;
}
if (currentStandaloneInputModule == null)
{
if (EventSystem.current == null)
@ -155,4 +160,4 @@ namespace Fungus
}
}

39
Assets/Fungus/Narrative/Scripts/PortraitController.cs

@ -13,7 +13,7 @@ using MoonSharp.Interpreter;
namespace Fungus
{
public struct PortraitOptions
public class PortraitOptions
{
public Character character;
public Character replacedCharacter;
@ -38,7 +38,6 @@ namespace Fungus
/// <param name="useDefaultSettings">Will use stage default times for animation and fade</param>
public PortraitOptions(bool useDefaultSettings = true)
{
// Defaults usually assigned on constructing a struct
character = null;
replacedCharacter = null;
portrait = null;
@ -53,7 +52,7 @@ namespace Fungus
waitUntilFinished = false;
onComplete = null;
// Special values that can be overriden
// Special values that can be overridden
fadeDuration = 0.5f;
moveDuration = 1f;
this.useDefaultSettings = useDefaultSettings;
@ -65,7 +64,7 @@ namespace Fungus
}
}
public struct PortraitState
public class PortraitState
{
public bool onScreen;
public bool dimmed;
@ -112,6 +111,7 @@ namespace Fungus
void Awake()
{
stage = GetComponentInParent<Stage>();
stage.CachePositions();
}
/// <summary>
@ -394,11 +394,13 @@ namespace Fungus
options.moveDuration = moveDuration;
options.waitUntilFinished = waitUntilFinished;
DoMoveTween(CleanPortraitOptions(options));
DoMoveTween(options);
}
public void DoMoveTween(PortraitOptions options)
{
CleanPortraitOptions(options);
// LeanTween doesn't handle 0 duration properly
float duration = (options.moveDuration > 0f) ? options.moveDuration : float.Epsilon;
@ -422,7 +424,7 @@ namespace Fungus
options.character = character;
options.fromPosition = options.toPosition = stage.GetPosition(position);
Show(CleanPortraitOptions(options));
Show(options);
}
/// <summary>
@ -441,7 +443,7 @@ namespace Fungus
options.toPosition = stage.GetPosition(toPosition);
options.move = true;
Show(CleanPortraitOptions(options));
Show(options);
}
/// <summary>
@ -453,7 +455,7 @@ namespace Fungus
/// <param name="optionsTable">Moonsharp Table</param>
public void Show(Table optionsTable)
{
Show(CleanPortraitOptions(PortraitUtil.ConvertTableToPortraitOptions(optionsTable, stage)));
Show(PortraitUtil.ConvertTableToPortraitOptions(optionsTable, stage));
}
/// <summary>
@ -462,6 +464,8 @@ namespace Fungus
/// <param name="options"></param>
public void Show(PortraitOptions options)
{
options = CleanPortraitOptions(options);
if (options.shiftIntoPlace)
{
options.fromPosition = Instantiate(options.toPosition) as RectTransform;
@ -507,9 +511,12 @@ namespace Fungus
}
// Fade in the new sprite image
options.character.state.portraitImage.sprite = options.portrait;
options.character.state.portraitImage.color = new Color(1f, 1f, 1f, 0f);
LeanTween.alpha(options.character.state.portraitImage.rectTransform, 1f, duration).setEase(stage.fadeEaseType);
if (options.character.state.portraitImage.sprite != options.portrait)
{
options.character.state.portraitImage.sprite = options.portrait;
options.character.state.portraitImage.color = new Color(1f, 1f, 1f, 0f);
LeanTween.alpha(options.character.state.portraitImage.rectTransform, 1f, duration).setEase(stage.fadeEaseType);
}
DoMoveTween(options);
@ -548,7 +555,7 @@ namespace Fungus
options.fromPosition = options.toPosition = character.state.position;
}
Show(CleanPortraitOptions(options));
Show(options);
}
/// <summary>
@ -560,7 +567,7 @@ namespace Fungus
PortraitOptions options = new PortraitOptions(true);
options.character = character;
Hide(CleanPortraitOptions(options));
Hide(options);
}
/// <summary>
@ -575,7 +582,7 @@ namespace Fungus
options.toPosition = stage.GetPosition(toPosition);
options.move = true;
Hide(CleanPortraitOptions(options));
Hide(options);
}
/// <summary>
@ -587,7 +594,7 @@ namespace Fungus
/// <param name="optionsTable">Moonsharp Table</param>
public void Hide(Table optionsTable)
{
Hide(CleanPortraitOptions(PortraitUtil.ConvertTableToPortraitOptions(optionsTable, stage)));
Hide(PortraitUtil.ConvertTableToPortraitOptions(optionsTable, stage));
}
/// <summary>
@ -596,6 +603,8 @@ namespace Fungus
/// <param name="options"></param>
public void Hide(PortraitOptions options)
{
CleanPortraitOptions(options);
if (options.character.state.display == DisplayType.None)
{
return;

21
Assets/Fungus/Narrative/Scripts/Stage.cs

@ -25,6 +25,7 @@ namespace Fungus
public Vector2 shiftOffset;
public Image defaultPosition;
public List<RectTransform> positions;
public RectTransform[] cachedPositions;
public List<Character> charactersOnStage = new List<Character>();
[HideInInspector]
@ -38,6 +39,12 @@ namespace Fungus
}
}
public void CachePositions()
{
cachedPositions = new RectTransform[positions.Count];
positions.CopyTo(cachedPositions);
}
protected virtual void OnDisable()
{
activeStages.Remove(this);
@ -61,21 +68,19 @@ namespace Fungus
/// <returns></returns>
public RectTransform GetPosition(String position_string)
{
if (position_string == null)
if (string.IsNullOrEmpty(position_string))
{
Debug.LogWarning("Missing stage position.");
return new RectTransform();
return null;
}
foreach (RectTransform position in positions)
for (int i = 0; i < cachedPositions.Length; i++)
{
if ( String.Compare(position.name, position_string, true) == 0 )
if ( String.Compare(cachedPositions[i].name, position_string, true) == 0 )
{
return position;
return cachedPositions[i];
}
}
Debug.LogWarning("Unidentified stage position: " + position_string);
return new RectTransform();
return null;
}
}
}

7
Assets/Fungus/Thirdparty/FungusLua/Resources/Lua/fungus.txt vendored

@ -197,6 +197,13 @@ function M.say(text, voiceclip)
M.runwait(e)
end
-- Say series of lines
-- conv: A string of conversational lines
function M.conversation(conv)
local e = luautils.Conversation(conv)
M.runwait(e)
end
--------------
-- Menu Dialog
--------------

219
Assets/Fungus/Thirdparty/FungusLua/Scripts/ConversationManager.cs vendored

@ -0,0 +1,219 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;
namespace Fungus
{
public class ConversationManager
{
protected Character[] characters;
protected Character currentCharacter;
protected Sprite currentPortrait;
protected RectTransform currentPosition;
protected Character previousCharacter;
protected Sprite previousPortrait;
protected RectTransform previousPosition;
protected bool exitSayWait;
public ConversationManager ()
{
// cache characters for faster lookup
characters = GameObject.FindObjectsOfType<Fungus.Character>();
}
protected Stage GetActiveStage()
{
if (Stage.activeStages == null ||
Stage.activeStages.Count == 0)
{
return null;
}
return Stage.activeStages[0];
}
/// <summary>
/// Parse and execute a conversation string
/// </summary>
/// <param name="conv"></param>
public IEnumerator Conversation(string conv)
{
if (string.IsNullOrEmpty(conv))
{
yield break;
}
SayDialog sayDialog = SayDialog.GetSayDialog();
if (sayDialog == null)
{
yield break;
}
//find SimpleScript say strings with portrait options
//You can test regex matches here: http://regexstorm.net/tester
Regex sayRegex = new Regex(@"((?<sayParams>[\w ,]*):)?(?<text>.*\r*\n)");
MatchCollection sayMatches = sayRegex.Matches(conv);
for (int i = 0; i < sayMatches.Count; i++)
{
previousCharacter = currentCharacter;
previousPortrait = currentPortrait;
previousPosition = currentPosition;
string sayParams = sayMatches[i].Groups["sayParams"].Value;
if (!string.IsNullOrEmpty(sayParams))
{
string[] separateParams;
if (sayParams.Contains(","))
{
separateParams = sayParams.Split(',');
for (int j = 0; j < separateParams.Length; j++)
{
separateParams[j] = separateParams[j].Trim();
}
}
else
{
separateParams = sayParams.Split(' ');
}
SetParams(separateParams);
}
else
{
//no params! Use previous settings?
}
string text = sayMatches[i].Groups["text"].Value;
sayDialog.gameObject.SetActive(true);
if (currentCharacter != null && currentCharacter != previousCharacter)
{
sayDialog.SetCharacter(currentCharacter);
}
Stage stage = GetActiveStage();
if (stage != null && currentCharacter != null && (currentPortrait != previousPortrait || currentPosition != previousPosition))
{
PortraitOptions portraitOptions = new PortraitOptions(true);
portraitOptions.character = currentCharacter;
portraitOptions.fromPosition = currentCharacter.state.position ?? previousPosition;
portraitOptions.toPosition = currentPosition;
portraitOptions.portrait = currentPortrait;
stage.Show(portraitOptions);
}
// Ignore Lua style comments and blank lines
if (text.StartsWith("--") || text.Trim() == "")
{
continue;
}
exitSayWait = false;
sayDialog.Say(text, true, true, true, false, null, () => {
exitSayWait = true;
});
while (!exitSayWait)
{
yield return null;
}
exitSayWait = false;
}
}
/// <summary>
/// Using the string of say parameters before the ':',
/// set the current character, position and portrait if provided.
/// </summary>
/// <param name="sayParams">The list of say parameters</param>
private void SetParams(string[] sayParams)
{
Character character = null;
Sprite portrait = null;
RectTransform position = null;
// try to find the character first, since we need to get its portrait
int characterIndex = -1;
for (int i = 0; character == null && i < sayParams.Length; i++)
{
for (int j = 0; j < characters.Length; j++)
{
if (characters[j].NameStartsWith(sayParams[i]))
{
characterIndex = i;
character = characters[j];
break;
}
}
}
// Assume last used character if none is specified now
if (character == null)
{
character = currentCharacter;
}
// Next see if we can find a portrait for this character
int portraitIndex = -1;
if (character != null)
{
for (int i = 0; i < sayParams.Length; i++)
{
if (portrait == null &&
character != null &&
i != characterIndex)
{
Sprite s = character.GetPortrait(sayParams[i]);
if (s != null)
{
portraitIndex = i;
portrait = s;
break;
}
}
}
}
// Next check if there's a position parameter
Stage stage = GetActiveStage();
if (stage != null)
{
for (int i = 0; i < sayParams.Length; i++)
{
if (i != characterIndex &&
i != portraitIndex)
{
position = stage.GetPosition(sayParams[i]);
break;
}
}
}
if (character != null)
{
currentCharacter = character;
}
if (portrait != null)
{
currentPortrait = portrait;
}
if (position != null)
{
currentPosition = position;
}
}
}
}

12
Assets/Fungus/Thirdparty/FungusLua/Scripts/ConversationManager.cs.meta vendored

@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 6ee240b2e8b559946a44b33a90cca00f
timeCreated: 1467644516
licenseType: Free
MonoImporter:
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

13
Assets/Fungus/Thirdparty/FungusLua/Scripts/LuaUtils.cs vendored

@ -72,6 +72,8 @@ namespace Fungus
protected StringSubstituter stringSubstituter;
protected ConversationManager conversationManager;
/// <summary>
/// Called by LuaEnvironment when initializing.
/// </summary>
@ -283,6 +285,8 @@ namespace Fungus
stringSubstituter = new StringSubstituter();
conversationManager = new ConversationManager();
if (fungusModule == FungusModuleOptions.UseGlobalVariables)
{
// Copy all items from the Fungus table to global variables
@ -466,6 +470,15 @@ namespace Fungus
}
return null;
}
/// <summary>
/// Use the conversation manager to play out a conversation
/// </summary>
/// <param name="conv"></param>
public virtual IEnumerator Conversation(string conv)
{
return conversationManager.Conversation(conv);
}
}
}

167
Assets/FungusExamples/FungusLua/Narrative/PortaitControlExample.unity

@ -185,6 +185,8 @@ GameObject:
- 114: {fileID: 574033267}
- 114: {fileID: 574033272}
- 114: {fileID: 574033266}
- 114: {fileID: 574033273}
- 114: {fileID: 574033271}
m_Layer: 0
m_Name: Flowchart
m_TagString: Untagged
@ -280,8 +282,8 @@ MonoBehaviour:
m_EditorClassIdentifier:
nodeRect:
serializedVersion: 2
x: 67
y: 70
x: 69.066124
y: 68.96694
width: 120
height: 40
itemId: 0
@ -289,6 +291,8 @@ MonoBehaviour:
description:
eventHandler: {fileID: 574033267}
commandList:
- {fileID: 574033271}
- {fileID: 574033273}
- {fileID: 574033272}
- {fileID: 574033266}
--- !u!114 &574033269
@ -308,7 +312,7 @@ MonoBehaviour:
variablesScrollPos: {x: 0, y: 0}
variablesExpanded: 1
blockViewHeight: 214
zoom: 1
zoom: 0.967998
scrollViewRect:
serializedVersion: 2
x: -343
@ -317,7 +321,7 @@ MonoBehaviour:
height: 859
selectedBlock: {fileID: 574033268}
selectedCommands:
- {fileID: 574033266}
- {fileID: 574033271}
variables: []
description:
stepPause: 0
@ -339,7 +343,48 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 4
m_RootOrder: 5
--- !u!114 &574033271
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 574033265}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 71f455683d4ba4405b8dbba457159620, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 7
errorMessage:
indentLevel: 0
luaEnvironment: {fileID: 0}
luaFile: {fileID: 0}
luaScript: 'conversation[[
watson annoyed left: What the deuce!
confident middle: I say!
annoyed: Well I never!
I exclaim!
sherlock bored right: ahem!
right: I concur.
angry: Wait, no I don''t!
]]
'
runAsCoroutine: 1
waitUntilFinished: 1
returnVariable: {fileID: 0}
--- !u!114 &574033272
MonoBehaviour:
m_ObjectHideFlags: 2
@ -383,6 +428,29 @@ MonoBehaviour:
runAsCoroutine: 1
waitUntilFinished: 1
returnVariable: {fileID: 0}
--- !u!114 &574033273
MonoBehaviour:
m_ObjectHideFlags: 2
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 574033265}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 71f455683d4ba4405b8dbba457159620, type: 3}
m_Name:
m_EditorClassIdentifier:
itemId: 6
errorMessage:
indentLevel: 0
luaEnvironment: {fileID: 1332690758}
luaFile: {fileID: 0}
luaScript: "conversation [[\r\nsherlock right: Character+position.\r\nThis is a
continuation of the last line.\nS bored left:All three options with name shortened.\nwatson
annoyed right: Adding a new character on the right.\r\nW, confident, offscreen
right: Move Watson offscreen using commas.\r\n]]"
runAsCoroutine: 1
waitUntilFinished: 1
returnVariable: {fileID: 0}
--- !u!1 &653560666 stripped
GameObject:
m_PrefabParentObject: {fileID: 110274, guid: c6289d5f8fa843145a2355af9cb09719, type: 2}
@ -473,7 +541,7 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
m_RootOrder: 3
--- !u!1 &856587351
GameObject:
m_ObjectHideFlags: 0
@ -548,7 +616,80 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 7
m_RootOrder: 8
--- !u!1 &1332690755
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 100640, guid: 49031c561e16d4fcf91c12153f8e0b25, type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 4
m_Component:
- 4: {fileID: 1332690759}
- 114: {fileID: 1332690756}
- 114: {fileID: 1332690758}
- 114: {fileID: 1332690757}
m_Layer: 0
m_Name: LuaEnvironment
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1332690756
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1332690755}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 3e93d27e4a7119643a1592b568a905df, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!114 &1332690757
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 11486636, guid: 49031c561e16d4fcf91c12153f8e0b25,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1332690755}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c10f0b861365b42b0928858f7b086ff3, type: 3}
m_Name:
m_EditorClassIdentifier:
fungusModule: 0
activeLanguage: en
stringTables: []
registerTypes:
- {fileID: 4900000, guid: 9c3ab7a98d51241bbb499643399fa761, type: 3}
- {fileID: 4900000, guid: 93fddea8208764a2dbb189cc238aed40, type: 3}
--- !u!114 &1332690758
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 11493126, guid: 49031c561e16d4fcf91c12153f8e0b25,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1332690755}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: ba19c26c1ba7243d2b57ebc4329cc7c6, type: 3}
m_Name:
m_EditorClassIdentifier:
remoteDebugger: 0
--- !u!4 &1332690759
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 495584, guid: 49031c561e16d4fcf91c12153f8e0b25, type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1332690755}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 1
--- !u!1 &1756024128
GameObject:
m_ObjectHideFlags: 1
@ -589,7 +730,7 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 3
m_RootOrder: 4
--- !u!1 &1818980091
GameObject:
m_ObjectHideFlags: 0
@ -625,6 +766,9 @@ MonoBehaviour:
portraits:
- {fileID: 21300000, guid: a92b08a118b7d46f59dd091acb2e4102, type: 3}
- {fileID: 21300000, guid: 03bc547cc0049594bae51f00903eedef, type: 3}
cachedPortraits:
- {fileID: 21300000, guid: a92b08a118b7d46f59dd091acb2e4102, type: 3}
- {fileID: 21300000, guid: 03bc547cc0049594bae51f00903eedef, type: 3}
portraitsFace: 0
setSayDialog: {fileID: 0}
description:
@ -640,7 +784,7 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 5
m_RootOrder: 6
--- !u!1 &1876668763
GameObject:
m_ObjectHideFlags: 0
@ -676,6 +820,9 @@ MonoBehaviour:
portraits:
- {fileID: 21300000, guid: 8f5b5b110e73a414eb229eeead86200f, type: 3}
- {fileID: 21300000, guid: c779e34c6eb8e45da98c70cf2802a54c, type: 3}
cachedPortraits:
- {fileID: 21300000, guid: 8f5b5b110e73a414eb229eeead86200f, type: 3}
- {fileID: 21300000, guid: c779e34c6eb8e45da98c70cf2802a54c, type: 3}
portraitsFace: 0
setSayDialog: {fileID: 0}
description:
@ -691,7 +838,7 @@ Transform:
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 6
m_RootOrder: 7
--- !u!1001 &2059718440
Prefab:
m_ObjectHideFlags: 0

Loading…
Cancel
Save