/** * <summary>Serialises appropriate GameObject values into a string.</summary> * <returns>The data, serialised as a string</returns> */ public TransformData SaveTransformData() { TransformData transformData = new TransformData(); transformData.objectID = constantID; transformData.savePrevented = savePrevented; switch (transformSpace) { case GlobalLocal.Global: { transformData.LocX = transform.position.x; transformData.LocY = transform.position.y; transformData.LocZ = transform.position.z; Char attachedChar = transform.GetComponent <Char> (); if (attachedChar != null) { transformData.RotX = attachedChar.TransformRotation.eulerAngles.x; transformData.RotY = attachedChar.TransformRotation.eulerAngles.y; transformData.RotZ = attachedChar.TransformRotation.eulerAngles.z; } else { transformData.RotX = transform.eulerAngles.x; transformData.RotY = transform.eulerAngles.y; transformData.RotZ = transform.eulerAngles.z; } } break; case GlobalLocal.Local: { transformData.LocX = transform.localPosition.x; transformData.LocY = transform.localPosition.y; transformData.LocZ = transform.localPosition.z; transformData.RotX = transform.localEulerAngles.x; transformData.RotY = transform.localEulerAngles.y; transformData.RotZ = transform.localEulerAngles.z; } break; } transformData.ScaleX = transform.localScale.x; transformData.ScaleY = transform.localScale.y; transformData.ScaleZ = transform.localScale.z; transformData.bringBack = saveScenePresence; transformData.linkedPrefabID = (saveScenePresence) ? linkedPrefabID : 0; if (saveParent) { // Attempt to find the "hand" bone of a character Transform t = transform.parent; if (t == null) { transformData.parentID = 0; return(transformData); } while (t.parent != null) { t = t.parent; AC.Char parentCharacter = t.GetComponent <AC.Char>(); if (parentCharacter != null) { if (parentCharacter.IsPlayer || (parentCharacter.GetComponent <ConstantID>() && parentCharacter.GetComponent <ConstantID>().constantID != 0)) { if (transform.parent == parentCharacter.leftHandBone || transform.parent == parentCharacter.rightHandBone) { if (parentCharacter.IsPlayer) { transformData.parentIsPlayer = true; transformData.parentIsNPC = false; transformData.parentID = 0; transformData.parentPlayerID = -1; if (KickStarter.settingsManager.playerSwitching == PlayerSwitching.Allow && parentCharacter != KickStarter.player) { Player player = parentCharacter as Player; transformData.parentPlayerID = player.ID; } } else { transformData.parentIsPlayer = false; transformData.parentIsNPC = true; transformData.parentID = parentCharacter.GetComponent <ConstantID>().constantID; transformData.parentPlayerID = -1; } if (transform.parent == parentCharacter.leftHandBone) { transformData.heldHand = Hand.Left; } else { transformData.heldHand = Hand.Right; } return(transformData); } } break; } } if (transform.parent.GetComponent <ConstantID>() && transform.parent.GetComponent <ConstantID>().constantID != 0) { transformData.parentID = transform.parent.GetComponent <ConstantID>().constantID; } else { transformData.parentID = 0; ACDebug.LogWarning("Could not save " + this.name + "'s parent since it has no Constant ID", this); } } return(transformData); }
private void AddCharHoles(PolygonCollider2D[] navPolys, AC.Char charToExclude, NavigationMesh navigationMesh) { if (navigationMesh.characterEvasion == CharacterEvasion.None) { return; } ResetHoles(KickStarter.sceneSettings.navMesh, false); for (int p = 0; p < navPolys.Length; p++) { if (p > 0) { return; } if (navPolys[p].transform.lossyScale != Vector3.one) { ACDebug.LogWarning("Cannot create evasion Polygons inside NavMesh '" + navPolys[p].gameObject.name + "' because it has a non-unit scale."); continue; } Vector2 navPosition = navPolys[p].transform.position; for (int c = 0; c < KickStarter.stateHandler.Characters.Count; c++) { AC.Char character = KickStarter.stateHandler.Characters[c]; CircleCollider2D circleCollider2D = character.GetComponent <CircleCollider2D>(); if (circleCollider2D != null && (character.charState == CharState.Idle || navigationMesh.characterEvasion == CharacterEvasion.AllCharacters) && (charToExclude == null || character != charToExclude) && UnityVersionHandler.Perform2DOverlapPoint(character.transform.position, NavigationEngine_PolygonCollider.results, 1 << KickStarter.sceneSettings.navMesh.gameObject.layer) != 0) { circleCollider2D.isTrigger = true; List <Vector2> newPoints3D = new List <Vector2>(); #if UNITY_5 || UNITY_2017_1_OR_NEWER Vector2 centrePoint = character.transform.TransformPoint(circleCollider2D.offset); #else Vector2 centrePoint = character.transform.TransformPoint(circleCollider2D.center); #endif float radius = circleCollider2D.radius * character.transform.localScale.x; float yScaler = navigationMesh.characterEvasionYScale; if (navigationMesh.characterEvasionPoints == CharacterEvasionPoints.Four) { newPoints3D.Add(centrePoint + new Vector2(dir_n.x * radius, dir_n.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_e.x * radius, dir_e.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_s.x * radius, dir_s.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_w.x * radius, dir_w.y * radius * yScaler)); } else if (navigationMesh.characterEvasionPoints == CharacterEvasionPoints.Eight) { newPoints3D.Add(centrePoint + new Vector2(dir_n.x * radius, dir_n.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_ne.x * radius, dir_ne.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_e.x * radius, dir_e.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_se.x * radius, dir_se.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_s.x * radius, dir_s.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sw.x * radius, dir_sw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_w.x * radius, dir_w.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nw.x * radius, dir_nw.y * radius * yScaler)); } else if (navigationMesh.characterEvasionPoints == CharacterEvasionPoints.Sixteen) { newPoints3D.Add(centrePoint + new Vector2(dir_n.x * radius, dir_n.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nne.x * radius, dir_nne.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_ne.x * radius, dir_ne.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nee.x * radius, dir_nee.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_e.x * radius, dir_e.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_see.x * radius, dir_see.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_se.x * radius, dir_se.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sse.x * radius, dir_sse.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_s.x * radius, dir_s.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_ssw.x * radius, dir_ssw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sw.x * radius, dir_sw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_sww.x * radius, dir_sww.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_w.x * radius, dir_w.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nww.x * radius, dir_nww.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nw.x * radius, dir_nw.y * radius * yScaler)); newPoints3D.Add(centrePoint + new Vector2(dir_nnw.x * radius, dir_nnw.y * radius * yScaler)); } navPolys[p].pathCount++; List <Vector2> newPoints = new List <Vector2>(); for (int i = 0; i < newPoints3D.Count; i++) { // Only add a point if it is on the NavMesh if (UnityVersionHandler.Perform2DOverlapPoint(newPoints3D[i], NavigationEngine_PolygonCollider.results, 1 << KickStarter.sceneSettings.navMesh.gameObject.layer) != 0) { newPoints.Add(newPoints3D[i] - navPosition); } else { Vector2 altPoint = GetLineIntersect(newPoints3D[i], centrePoint); if (altPoint != Vector2.zero) { newPoints.Add(altPoint - navPosition); } } } if (newPoints.Count > 1) { navPolys[p].SetPath(navPolys[p].pathCount - 1, newPoints.ToArray()); } } } RebuildVertexArray(navPolys[p].transform, navPolys[p], p); } }
protected void SharedGUITwo(AC.Char _target) { EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Physics settings:", EditorStyles.boldLabel); _target.ignoreGravity = EditorGUILayout.Toggle("Ignore gravity?", _target.ignoreGravity); if (_target.GetComponent <Rigidbody>() != null || _target.GetComponent <Rigidbody2D>() != null) { _target.freezeRigidbodyWhenIdle = EditorGUILayout.Toggle("Freeze Rigidbody when Idle?", _target.freezeRigidbodyWhenIdle); if (_target.GetComponent <Rigidbody>() != null) { _target.useRigidbodyForMovement = EditorGUILayout.Toggle("Move with Rigidbody?", _target.useRigidbodyForMovement); if (_target.useRigidbodyForMovement) { if (_target.GetAnimator() != null && _target.GetAnimator().applyRootMotion) { EditorGUILayout.HelpBox("Rigidbody movement will be disabled as 'Root motion' is enabled in the Animator.", MessageType.Info); } else if (_target.GetComponent <Rigidbody>().interpolation == RigidbodyInterpolation.None) { EditorGUILayout.HelpBox("For smooth movement, the Rigidbody's 'Interpolation' should be set to either 'Interpolate' or 'Extrapolate'.", MessageType.Warning); } } } else if (_target.GetComponent <Rigidbody2D>() != null) { _target.useRigidbody2DForMovement = EditorGUILayout.Toggle("Move with Rigidbody 2D?", _target.useRigidbody2DForMovement); if (_target.useRigidbody2DForMovement) { if (_target.GetAnimator() != null && _target.GetAnimator().applyRootMotion) { EditorGUILayout.HelpBox("Rigidbody movement will be disabled as 'Root motion' is enabled in the Animator.", MessageType.Info); } else if (_target.GetComponent <Rigidbody2D>().interpolation == RigidbodyInterpolation2D.None) { EditorGUILayout.HelpBox("For smooth movement, the Rigidbody's 'Interpolation' should be set to either 'Interpolate' or 'Extrapolate'.", MessageType.Warning); } if (SceneSettings.CameraPerspective != CameraPerspective.TwoD) { EditorGUILayout.HelpBox("Rigidbody2D-based motion only allows for X and Y movement, not Z, which may not be appropriate for 3D.", MessageType.Warning); } #if (UNITY_5_6_OR_NEWER || UNITY_2017_1_OR_NEWER) if (_target.GetAnimEngine().isSpriteBased&& _target.turn2DCharactersIn3DSpace) { EditorGUILayout.HelpBox("For best results, 'Turn root object in 3D space?' above should be disabled.", MessageType.Warning); } #endif } } } if (_target.GetComponent <Collider>() != null && _target.GetComponent <CharacterController>() == null) { _target.groundCheckLayerMask = LayerMaskField("Ground-check layer(s):", _target.groundCheckLayerMask); } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Audio clips:", EditorStyles.boldLabel); _target.walkSound = (AudioClip)EditorGUILayout.ObjectField("Walk sound:", _target.walkSound, typeof(AudioClip), false); _target.runSound = (AudioClip)EditorGUILayout.ObjectField("Run sound:", _target.runSound, typeof(AudioClip), false); if (AdvGame.GetReferences() != null && AdvGame.GetReferences().speechManager != null && AdvGame.GetReferences().speechManager.scrollSubtitles) { _target.textScrollClip = (AudioClip)EditorGUILayout.ObjectField("Text scroll override:", _target.textScrollClip, typeof(AudioClip), false); } _target.soundChild = (Sound)EditorGUILayout.ObjectField("SFX Sound child:", _target.soundChild, typeof(Sound), true); _target.speechAudioSource = (AudioSource)EditorGUILayout.ObjectField("Speech AudioSource:", _target.speechAudioSource, typeof(AudioSource), true); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Dialogue settings:", EditorStyles.boldLabel); _target.speechColor = EditorGUILayout.ColorField("Speech text colour:", _target.speechColor); _target.speechLabel = EditorGUILayout.TextField("Speaker label:", _target.speechLabel); _target.speechMenuPlacement = (Transform)EditorGUILayout.ObjectField("Speech menu placement child:", _target.speechMenuPlacement, typeof(Transform), true); if (_target.useExpressions) { EditorGUILayout.LabelField("Default portrait graphic:"); } else { EditorGUILayout.LabelField("Portrait graphic:"); } _target.portraitIcon.ShowGUI(false); _target.useExpressions = EditorGUILayout.Toggle("Use expressions?", _target.useExpressions); if (_target.useExpressions) { EditorGUILayout.Space(); EditorGUILayout.BeginVertical("Button"); for (int i = 0; i < _target.expressions.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Expression #" + _target.expressions[i].ID.ToString(), EditorStyles.boldLabel); if (GUILayout.Button(Resource.CogIcon, GUILayout.Width(20f), GUILayout.Height(15f))) { ExpressionSideMenu(_target, i); } EditorGUILayout.EndHorizontal(); _target.expressions[i].ShowGUI(); } if (GUILayout.Button("Add new expression")) { _target.expressions.Add(new Expression(GetExpressionIDArray(_target.expressions))); } EditorGUILayout.EndVertical(); } EditorGUILayout.EndVertical(); }
protected void SharedGUITwo(AC.Char _target) { EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Physics settings:", EditorStyles.boldLabel); _target.ignoreGravity = CustomGUILayout.Toggle("Ignore gravity?", _target.ignoreGravity, "", "If True, the character will ignore the effects of gravity"); if (_target.GetComponent <Rigidbody>() != null || _target.GetComponent <Rigidbody2D>() != null) { _target.freezeRigidbodyWhenIdle = CustomGUILayout.Toggle("Freeze Rigidbody when Idle?", _target.freezeRigidbodyWhenIdle, "", "If True, the character's Rigidbody will be frozen in place when idle. This is to help slipping when on sloped surfaces"); if (_target.GetComponent <Rigidbody>() != null) { _target.useRigidbodyForMovement = CustomGUILayout.Toggle("Move with Rigidbody?", _target.useRigidbodyForMovement, "", "If True, then it will be moved by adding forces in FixedUpdate, as opposed to the transform being manipulated in Update"); if (_target.useRigidbodyForMovement) { if (_target.GetAnimator() != null && _target.GetAnimator().applyRootMotion) { EditorGUILayout.HelpBox("Rigidbody movement will be disabled as 'Root motion' is enabled in the Animator.", MessageType.Warning); } else if (_target.GetComponent <Rigidbody>().interpolation == RigidbodyInterpolation.None) { EditorGUILayout.HelpBox("For smooth movement, the Rigidbody's 'Interpolation' should be set to either 'Interpolate' or 'Extrapolate'.", MessageType.Warning); } } } else if (_target.GetComponent <Rigidbody2D>() != null) { _target.useRigidbody2DForMovement = CustomGUILayout.Toggle("Move with Rigidbody 2D?", _target.useRigidbody2DForMovement, "", "If True, then it will be moved by adding forces in FixedUpdate, as opposed to the transform being manipulated in Update"); if (_target.useRigidbody2DForMovement) { if (_target.GetAnimator() != null && _target.GetAnimator().applyRootMotion) { EditorGUILayout.HelpBox("Rigidbody movement will be disabled as 'Root motion' is enabled in the Animator.", MessageType.Warning); } else if (_target.GetComponent <Rigidbody2D>().interpolation == RigidbodyInterpolation2D.None) { EditorGUILayout.HelpBox("For smooth movement, the Rigidbody's 'Interpolation' should be set to either 'Interpolate' or 'Extrapolate'.", MessageType.Warning); } if (SceneSettings.CameraPerspective != CameraPerspective.TwoD) { EditorGUILayout.HelpBox("Rigidbody2D-based motion only allows for X and Y movement, not Z, which may not be appropriate for 3D.", MessageType.Warning); } #if (UNITY_5_6_OR_NEWER || UNITY_2017_1_OR_NEWER) if (_target.GetAnimEngine().isSpriteBased&& _target.turn2DCharactersIn3DSpace) { EditorGUILayout.HelpBox("For best results, 'Turn root object in 3D space?' above should be disabled.", MessageType.Warning); } #endif } } } if (_target.GetComponent <Collider>() != null && _target.GetComponent <CharacterController>() == null) { _target.groundCheckLayerMask = LayerMaskField("Ground-check layer(s):", _target.groundCheckLayerMask); } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Audio clips:", EditorStyles.boldLabel); _target.walkSound = (AudioClip)CustomGUILayout.ObjectField <AudioClip> ("Walk sound:", _target.walkSound, false, "", "The sound to play when walking"); _target.runSound = (AudioClip)CustomGUILayout.ObjectField <AudioClip> ("Run sound:", _target.runSound, false, "", "The sound to play when running"); if (AdvGame.GetReferences() != null && AdvGame.GetReferences().speechManager != null && AdvGame.GetReferences().speechManager.scrollSubtitles) { _target.textScrollClip = (AudioClip)CustomGUILayout.ObjectField <AudioClip> ("Text scroll override:", _target.textScrollClip, false, "", "The sound to play when the character's speech text is scrolling"); } _target.soundChild = (Sound)CustomGUILayout.ObjectField <Sound> ("SFX Sound child:", _target.soundChild, true, "", ""); _target.speechAudioSource = (AudioSource)CustomGUILayout.ObjectField <AudioSource> ("Speech AudioSource:", _target.speechAudioSource, true, "", "The AudioSource from which to play speech audio"); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Dialogue settings:", EditorStyles.boldLabel); _target.speechColor = CustomGUILayout.ColorField("Speech text colour:", _target.speechColor, "", ""); _target.speechLabel = CustomGUILayout.TextField("Speaker label:", _target.speechLabel, "", ""); _target.speechMenuPlacement = (Transform)CustomGUILayout.ObjectField <Transform> ("Speech menu placement child:", _target.speechMenuPlacement, true, "", "The Transform at which to place Menus set to appear 'Above Speaking Character'. If this is not set, the placement will be set automatically"); if (_target.useExpressions) { EditorGUILayout.LabelField("Default portrait graphic:"); } else { EditorGUILayout.LabelField("Portrait graphic:"); } _target.portraitIcon.ShowGUI(false); _target.useExpressions = CustomGUILayout.Toggle("Use expressions?", _target.useExpressions, "", "If True, speech text can use expression tokens to change the character's expression"); if (_target.useExpressions) { _target.GetAnimEngine().CharExpressionsGUI(); EditorGUILayout.Space(); EditorGUILayout.BeginVertical("Button"); for (int i = 0; i < _target.expressions.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Expression #" + _target.expressions[i].ID.ToString(), EditorStyles.boldLabel); if (GUILayout.Button("", CustomStyles.IconCog)) { ExpressionSideMenu(_target, i); } EditorGUILayout.EndHorizontal(); _target.expressions[i].ShowGUI(); } if (GUILayout.Button("Add new expression")) { _target.expressions.Add(new Expression(GetExpressionIDArray(_target.expressions))); } EditorGUILayout.EndVertical(); } EditorGUILayout.EndVertical(); }
/** * <summary>Serialises appropriate GameObject values into a string.</summary> * <returns>The data, serialised as a string</returns> */ public TransformData SaveTransformData() { TransformData transformData = new TransformData(); transformData.objectID = constantID; transformData.savePrevented = savePrevented; transformData.LocX = transform.position.x; transformData.LocY = transform.position.y; transformData.LocZ = transform.position.z; transformData.RotX = transform.eulerAngles.x; transformData.RotY = transform.eulerAngles.y; transformData.RotZ = transform.eulerAngles.z; transformData.ScaleX = transform.localScale.x; transformData.ScaleY = transform.localScale.y; transformData.ScaleZ = transform.localScale.z; transformData.bringBack = saveScenePresence; transformData.linkedPrefabID = (saveScenePresence) ? linkedPrefabID : 0; if (saveParent) { // Attempt to find the "hand" bone of a character Transform t = transform.parent; if (t == null) { transformData.parentID = 0; return(transformData); } while (t.parent != null) { t = t.parent; if (t.GetComponent <AC.Char>()) { AC.Char parentCharacter = t.GetComponent <AC.Char>(); if (parentCharacter is Player || (parentCharacter.GetComponent <ConstantID>() && parentCharacter.GetComponent <ConstantID>().constantID != 0)) { if (transform.parent == parentCharacter.leftHandBone || transform.parent == parentCharacter.rightHandBone) { if (parentCharacter.IsPlayer) { transformData.parentIsPlayer = true; transformData.parentIsNPC = false; transformData.parentID = 0; } else { transformData.parentIsPlayer = false; transformData.parentIsNPC = true; transformData.parentID = parentCharacter.GetComponent <ConstantID>().constantID; } if (transform.parent == parentCharacter.leftHandBone) { transformData.heldHand = Hand.Left; } else { transformData.heldHand = Hand.Right; } return(transformData); } } break; } } if (transform.parent.GetComponent <ConstantID>() && transform.parent.GetComponent <ConstantID>().constantID != 0) { transformData.parentID = transform.parent.GetComponent <ConstantID>().constantID; } else { transformData.parentID = 0; ACDebug.LogWarning("Could not save " + this.name + "'s parent since it has no Constant ID"); } } return(transformData); }
protected void SharedGUITwo(AC.Char _target) { EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Physics settings:", EditorStyles.boldLabel); _target.ignoreGravity = EditorGUILayout.Toggle("Ignore gravity?", _target.ignoreGravity); if (_target.GetComponent <Rigidbody>() != null || _target.GetComponent <Rigidbody2D>() != null) { _target.freezeRigidbodyWhenIdle = EditorGUILayout.Toggle("Freeze Rigidbody when Idle?", _target.freezeRigidbodyWhenIdle); if (_target.GetComponent <Rigidbody>() != null) { _target.useRigidbodyForMovement = EditorGUILayout.Toggle("Move with Rigidbody?", _target.useRigidbodyForMovement); if (_target.useRigidbodyForMovement) { if (_target.GetAnimator() != null && _target.GetAnimator().applyRootMotion) { EditorGUILayout.HelpBox("Rigidbody movement will be disabled as 'Root motion' is enabled in the Animator.", MessageType.Info); } else if (_target.GetComponent <Rigidbody>().interpolation == RigidbodyInterpolation.None) { EditorGUILayout.HelpBox("For smooth movement, the Rigidbody's 'Interpolation' should be set to either 'Interpolate' or 'Extrapolate'.", MessageType.Warning); } } } else if (_target.GetComponent <Rigidbody2D>() != null) { _target.useRigidbody2DForMovement = EditorGUILayout.Toggle("Move with Rigidbody 2D?", _target.useRigidbody2DForMovement); if (_target.useRigidbody2DForMovement) { if (_target.GetAnimator() != null && _target.GetAnimator().applyRootMotion) { EditorGUILayout.HelpBox("Rigidbody movement will be disabled as 'Root motion' is enabled in the Animator.", MessageType.Info); } else if (_target.GetComponent <Rigidbody2D>().interpolation == RigidbodyInterpolation2D.None) { EditorGUILayout.HelpBox("For smooth movement, the Rigidbody's 'Interpolation' should be set to either 'Interpolate' or 'Extrapolate'.", MessageType.Warning); } } } } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Audio clips:", EditorStyles.boldLabel); _target.walkSound = (AudioClip)EditorGUILayout.ObjectField("Walk sound:", _target.walkSound, typeof(AudioClip), false); _target.runSound = (AudioClip)EditorGUILayout.ObjectField("Run sound:", _target.runSound, typeof(AudioClip), false); if (AdvGame.GetReferences() != null && AdvGame.GetReferences().speechManager != null && AdvGame.GetReferences().speechManager.scrollSubtitles) { _target.textScrollClip = (AudioClip)EditorGUILayout.ObjectField("Text scroll override:", _target.textScrollClip, typeof(AudioClip), false); } _target.soundChild = (Sound)EditorGUILayout.ObjectField("SFX Sound child:", _target.soundChild, typeof(Sound), true); _target.speechAudioSource = (AudioSource)EditorGUILayout.ObjectField("Speech AudioSource:", _target.speechAudioSource, typeof(AudioSource), true); EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical("Button"); EditorGUILayout.LabelField("Dialogue settings:", EditorStyles.boldLabel); _target.speechColor = EditorGUILayout.ColorField("Speech text colour:", _target.speechColor); _target.speechLabel = EditorGUILayout.TextField("Speaker label:", _target.speechLabel); _target.speechMenuPlacement = (Transform)EditorGUILayout.ObjectField("Speech menu placement child:", _target.speechMenuPlacement, typeof(Transform), true); if (_target.useExpressions) { EditorGUILayout.LabelField("Default portrait graphic:"); } else { EditorGUILayout.LabelField("Portrait graphic:"); } _target.portraitIcon.ShowGUI(false); _target.useExpressions = EditorGUILayout.Toggle("Use expressions?", _target.useExpressions); if (_target.useExpressions) { EditorGUILayout.Space(); EditorGUILayout.BeginVertical("Button"); for (int i = 0; i < _target.expressions.Count; i++) { EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Expression #" + _target.expressions[i].ID.ToString(), EditorStyles.boldLabel); if (GUILayout.Button(Resource.CogIcon, GUILayout.Width(20f), GUILayout.Height(15f))) { ExpressionSideMenu(_target, i); } EditorGUILayout.EndHorizontal(); _target.expressions[i].ShowGUI(); } if (GUILayout.Button("Add new expression")) { _target.expressions.Add(new Expression(GetExpressionIDArray(_target.expressions))); } EditorGUILayout.EndVertical(); } EditorGUILayout.EndVertical(); }