26

(152 replies, posted in Showcase)

KRGraphics wrote:

Here is a gif

http://i.giphy.com/3o7TKxMkPrn05LpeMw.gif

For this case check your default fall down animation. UFE does not have a specific animation for death. I believe you will want to use an animation that looks less like a strong impact or as if the character was being launched in the air.

27

(152 replies, posted in Showcase)

I might be able to take a look at this tonight. Wich version of UFE are you using? PM me if necessary.

28

(152 replies, posted in Showcase)

As far as I know UFE currently only recognizes charging times for the first key pressed. You should also check the "Allow Input Leniency" and set its value to 2(wich will be the amount of keys pressed to trigger the move).

29

(2 replies, posted in UFE 1 (Deprecated))

Check the Player Conditions of the move. If you haven't set any condition it will play even when lying down.

30

(9 replies, posted in UFE 1 (Deprecated))

In the Global Editor>Combo Options there is a Minimum Damage field. Check if that is the amount of health being subtracted from your opponent.

I believe it is on CameraScript.cs.

Inside DoFixedUpdate():

Vector3 newPosition = ((player1.position + player2.position) / 2) + UFE.config.cameraOptions.initialDistance;

When it comes to code, the possibilities are many. This approach is by far the simplest/easiest one, I believe.

Ok, here it goes. In order to open your music screen, here's what you need to do:

In GlobalInfo.cs, after:

public PauseScreen pauseScreen;

Add:

public JukeBoxScreen jukeBoxScreen;

This name is just an example, use the one that suits best your needs.
==================================================================================
In GlobalEditorWindow.cs, after:

EditorGUILayout.BeginHorizontal();
{
    globalInfo.gameGUI.pauseScreen = (PauseScreen)EditorGUILayout.ObjectField("Pause Screen:" , globalInfo.gameGUI.pauseScreen , typeof(PauseScreen) , true);
    EditorGUI.BeginDisabledGroup(DisableScreenButton(globalInfo.gameGUI.pauseScreen));
    {
        ScreenButton(globalInfo.gameGUI.pauseScreen);
    }
    EditorGUI.EndDisabledGroup();
}
EditorGUILayout.EndHorizontal();

Add:

EditorGUILayout.BeginHorizontal();
{
    globalInfo.gameGUI.jukeBoxScreen = (JukeBoxScreen)EditorGUILayout.ObjectField("JukeBox Screen:" , globalInfo.gameGUI.jukeBoxScreen , typeof(JukeBoxScreen) , true);
    EditorGUI.BeginDisabledGroup(DisableScreenButton(globalInfo.gameGUI.jukeBoxScreen));
    {
        ScreenButton(globalInfo.gameGUI.jukeBoxScreen);
    }
    EditorGUI.EndDisabledGroup();
}
EditorGUILayout.EndHorizontal();

==================================================================================

In UFE.cs, before:

EDIT: this was made in the bundle version, so if you don't have the Bluetooth related stuff, just pick another function as reference. It is just a matter of keeping the functions on the same order on all the classes so when you want to edit in the future you won't get lost.

public static void StartBluetoothGameScreen()
{
    UFE.StartBluetoothGameScreen(UFE.config.gameGUI.screenFadeDuration);
}

Add:

public static void StartJukeBoxScreen()
{
    UFE.StartJukeBoxScreen(UFE.config.gameGUI.screenFadeDuration);
}

public static void StartJukeBoxScreen(float fadeTime)
{
    UFE.eventSystem.enabled = false;
    CameraFade.StartAlphaFade(
        UFE.config.gameGUI.screenFadeColor ,
        false ,
        fadeTime / 2f ,
        0f ,
        () => { UFE.eventSystem.enabled = true; UFE._StartJukeBoxScreen(fadeTime / 2f); }
    );
}

Before:

private static void _StartBluetoothGameScreen(float fadeTime)

Add:

private static void _StartJukeBoxScreen(float fadeTime)
{
    CameraFade.StartAlphaFade(UFE.config.gameGUI.screenFadeColor , true , fadeTime);
    
    UFE.EndGame();
    UFE.HideScreen(UFE.currentScreen);
    if (UFE.config.gameGUI.jukeBoxScreen == null)
    {
        Debug.LogError("JukeBox Screen not found! Make sure you have set the prefab correctly in the Global Editor");
    }
    else
    {
        UFE.ShowScreen(UFE.config.gameGUI.jukeBoxScreen);
    }
}

==================================================================================

Now, depending from wich screen you'll call your "music screen", this will change. I used the MainMenuScreen:

In MainMenuScreen.cs, before:

public virtual void GoToBluetoothPlayScreen()
{
    UFE.StartBluetoothGameScreen();
}

Add

public virtual void GoToJukeBoxScreen()
{
    UFE.StartJukeBoxScreen();
}

==================================================================================

If you already have the classes for your screens there is no need to create these, just remember to reference the classes you have instead of the ones I used above:

Create the JukeBoxScreen.cs class inside UFE\Scripts\UI\Base:

PS: Some devolepment softwares might create them in a default place, you will have to drag them to the correct place and maybe will need to add a reference to the class. Unless you don't care where the physical location of your classes are.

public class JukeBoxScreen : UFEScreen
{
    //Code Goes Here
}

Create the DefaultJukeBoxScreen.cs class inside UFE\Scripts\UI\Templates:

class DefaultJukeBoxScreen : JukeBoxScreen
{
    // Your Stuff Here
}

That's the minimum you'll have to do to achieve what you need.

==================================================================================

Now, go to unity:

PS2: I have now realized I attached the wrong Script to the prefab. Attach the DefaultJukeBoxScreen.cs instead.

http://i66.tinypic.com/34oeqkj.jpg
http://i64.tinypic.com/s2zhi9.jpg

On your screen that will call the "music screen", on the "Listen" button, add as in the image below:
http://i68.tinypic.com/vdfyqg.jpg

Remember that the JukeBoxScreen and DefaultJukeBoxScreen are just "dummy" classes and need to be filled with the code necessary for them to work, it means that if you have something ready to use, just use your own classes.

For reference you can see how DefaultCharacterSelectionScreen.cs and CharacterSelectionScreen.cs works. They are good examples for a new screen that you might want to create in the future.

Thats it, any doubts just contact me.

34

(4 replies, posted in Tips & Articles)

Updated the post to add a usage example to help people use this.

35

(4 replies, posted in Tips & Articles)

shannonrattler33 wrote:

I have implemented the code with no errors when compling but the health bar doesnt drain

After implementing it in a fresh project, it worked normally.

Did you remember to set the options in the MoveEditor>Gauge/Meter Options?

36

(4 replies, posted in UFE 1 (Deprecated))

Update version of this for UFE 1.8 here: http://www.ufe3d.com/forum/viewtopic.php?pid=4527

37

(4 replies, posted in Tips & Articles)

Hello Everyone!

This is an adaptation and expansion of the Gauge Drain. I created it to have a "bleed" effect/debuff on characters.

This was made on UFE 1.8 and unity 5.4.1f1.

For this to work you will need to change CharacterInfo.cs, MoveInfo.cs, MoveEditorWindow.cs and ControlsScript.cs.

In CharacterInfo.cs, right before:

[System.Serializable]
public class CharacterInfo: ScriptableObject

Add:

[System.Serializable]
public class CharacterDebuff {
    public string moveName;
    public int playerNumber;
    public float hpDrainDuration;
    public float currentHPDrainDuration;
    public float hpDrainInterval;
    public float currentHPDrainInterval;
    public float damagePerInterval;
    public MoveInfo hpDrainMove;
    public CombatStances hpDrainStance;
}

That's all for CharacterInfo.

==================================================================================

In MoveInfo.cs, after:

public enum CurrentFrameData {
    Any,
    StartupFrames,
    ActiveFrames,
    RecoveryFrames
}

Add:

public enum HealthDrainStart {
    OnMoveCast,
    OnHit
}

And after:

public CombatStances DCStance;

Add:

    // Health drain variables
    public bool isSelfHPDrain;
    public HealthDrainStart selfDrainMode;
    public float selfHPDrainDuration;
    public float selfHPDrainInterval;
    public float selfDamagePerInterval;
    public bool stopDrainingOwnHealth; //Clears all health drains on self that were inflicted by yourself
    public MoveInfo selfHPDrainMove;
    public CombatStances selfHPDrainStance;

    public bool isOpHPDrain;
    public HealthDrainStart opDrainMode;
    public float opHPDrainDuration;
    public float opHPDrainInterval;
    public float opDamagePerInterval;
    public bool stopOpHealthDrainFromSelf; //Clears all health drains on self that were inflicted by the opponent

That's it for MoveInfo.

==================================================================================

In MoveEditorWindow.cs, after:

moveInfo.stopDrainingGauge = EditorGUILayout.Toggle("Stop Draining", moveInfo.stopDrainingGauge, toggleStyle);

EDIT: The original is above. Change it to the lines below for more clarity.

moveInfo.stopDrainingGauge = EditorGUILayout.Toggle("Stop Draining Gauge" , moveInfo.stopDrainingGauge , toggleStyle);
EditorGUILayout.Space();

Add:

// Health Drain: Self
EditorGUI.BeginDisabledGroup(moveInfo.stopDrainingOwnHealth); {
    moveInfo.isSelfHPDrain = EditorGUILayout.Toggle("Drain Own Health" , moveInfo.isSelfHPDrain , toggleStyle);
    if (moveInfo.isSelfHPDrain) {
        moveInfo.selfDrainMode = (HealthDrainStart)EditorGUILayout.EnumPopup("Drain Starts On:" , moveInfo.selfDrainMode);
        moveInfo.selfHPDrainDuration = EditorGUILayout.FloatField("- Drain Duration (seconds):" , moveInfo.selfHPDrainDuration);
        moveInfo.selfHPDrainInterval = EditorGUILayout.FloatField("- Drain Interval (seconds):" , moveInfo.selfHPDrainInterval);
        moveInfo.selfDamagePerInterval = EditorGUILayout.FloatField("- Damage Per Interval:" , moveInfo.selfDamagePerInterval);
        moveInfo.selfHPDrainMove = (MoveInfo)EditorGUILayout.ObjectField("- Move (Drain Complete):" , moveInfo.selfHPDrainMove , typeof(MoveInfo) , false);
        moveInfo.selfHPDrainStance = (CombatStances)EditorGUILayout.EnumPopup("- Stance (Drain Complete):" , moveInfo.selfHPDrainStance , enumStyle);
    }
}
EditorGUI.EndDisabledGroup();

moveInfo.stopDrainingOwnHealth = EditorGUILayout.Toggle("Stop Draining Own Health" , moveInfo.stopDrainingOwnHealth , toggleStyle);
EditorGUIUtility.labelWidth = 300;
moveInfo.stopOpHealthDrainFromSelf = EditorGUILayout.Toggle("Stop Opponent's Health Drain On Yourself" , moveInfo.stopOpHealthDrainFromSelf , toggleStyle);
EditorGUIUtility.labelWidth = 150;

After:

moveInfo.opGaugeGainOnParry = StyledSlider("Gauge Gain on Parry (%)" , moveInfo.opGaugeGainOnParry , EditorGUI.indentLevel , 0 , 100);

Add:

EditorGUIUtility.labelWidth = 200;
// Health Drain: Opponent
moveInfo.isOpHPDrain = EditorGUILayout.Toggle("Drain Opponent's Health" , moveInfo.isOpHPDrain , toggleStyle);
if (moveInfo.isOpHPDrain) {
    moveInfo.opDrainMode = (HealthDrainStart)EditorGUILayout.EnumPopup("Drain Starts On:" , moveInfo.opDrainMode);
    moveInfo.opHPDrainDuration = EditorGUILayout.FloatField("- Drain Duration (seconds):" , moveInfo.opHPDrainDuration);
    moveInfo.opHPDrainInterval = EditorGUILayout.FloatField("- Drain Interval (seconds):" , moveInfo.opHPDrainInterval);
    moveInfo.opDamagePerInterval = EditorGUILayout.FloatField("- Damage Per Interval:" , moveInfo.opDamagePerInterval);
}

That's all for MoveEditorWindow.

==================================================================================

In ControlsScript.cs, in the variables declaration at the beggining of the script, after:

private CombatStances DCStance;

Add:

// Keep Track of all the health drains on the player
private List<CharacterDebuff> playerDebuffs;

Inside the Start() function, after:

if (playerNum == 2) UFE.FireGameBegins();

Add:

// Health Drain
DrainHealth(true);

Inside DoFixedUpdate(), after:

if (currentMove != null) ReadMove(currentMove);

Add:

// Health Drain
DrainHealth(false);

Inside ReadMove(), inside the if:

if (move.currentTick == 0)

After:

if (move.stopDrainingGauge) {
    gaugeDPS = 0;
    inhibitGainWhileDraining = false;
}

Add:

// Health drain
// Self Drain
if (move.isSelfHPDrain && move.selfDrainMode == HealthDrainStart.OnMoveCast) {
    StartHealthDrain(move , this.playerNum);
}

// Opponent Drain
if (move.isOpHPDrain && move.opDrainMode == HealthDrainStart.OnMoveCast) {
    opControlsScript.StartHealthDrain(move , this.playerNum);
}

// Stop Health Drain
StopHealthDrain(move);

Inside GetHit(), as the first thing, add:

// Health Drain
if (opControlsScript.currentMove != null) {
    if (opControlsScript.currentMove.isSelfHPDrain && opControlsScript.currentMove.selfDrainMode == HealthDrainStart.OnHit) {
        opControlsScript.StartHealthDrain(opControlsScript.currentMove , opControlsScript.playerNum);
    }
    if (opControlsScript.currentMove.isOpHPDrain && opControlsScript.currentMove.opDrainMode == HealthDrainStart.OnHit) {
        StartHealthDrain(opControlsScript.currentMove , opControlsScript.playerNum);
    }
}

Do the same for GetHitBlocking(), if you want this to work even when blocking.

Inside EndRound(), after:

opControlsScript.ResetDrainStatus(true);

Add:

// Reset Health Drain
DrainHealth(true);
opControlsScript.DrainHealth(true);

Now, at the very end of ControlsScript, after:

void shake() {
    float rnd = Random.Range(-.1f * shakeDensity , .2f * shakeDensity);
    character.transform.localPosition = new Vector3(rnd , 0 , 0);
}

Add the functions that will make it all work:

// Start health drain
public void StartHealthDrain(MoveInfo inputMove , int inputPlayer) {
    bool foundExistingSelfDebuff = false;
    bool foundExistingOpDebuff = false;
    foreach (CharacterDebuff debuff in playerDebuffs) {
        // Drain Opponent's Health
        if (debuff.moveName == inputMove.moveName &&
            inputMove.isOpHPDrain &&
            inputPlayer != this.playerNum) {
            foundExistingOpDebuff = true;
            debuff.hpDrainDuration = inputMove.opHPDrainDuration;
            debuff.hpDrainInterval = inputMove.opHPDrainInterval;
            debuff.damagePerInterval = inputMove.opDamagePerInterval;
            debuff.currentHPDrainDuration = 0f;
            debuff.currentHPDrainInterval = 0f;
        }
        // Drain Own Health
        if (debuff.moveName == inputMove.moveName &&
            inputMove.isSelfHPDrain &&
            inputPlayer == this.playerNum) {
            foundExistingSelfDebuff = true;
            debuff.hpDrainDuration = inputMove.selfHPDrainDuration;
            debuff.hpDrainInterval = inputMove.selfHPDrainInterval;
            debuff.damagePerInterval = inputMove.selfDamagePerInterval;
            debuff.currentHPDrainDuration = 0f;
            debuff.currentHPDrainInterval = 0f;
        }
    }
    // New Drain: opponent's health
    if (!foundExistingOpDebuff && inputMove.isOpHPDrain && inputPlayer != this.playerNum) {
        if (playerDebuffs == null) playerDebuffs = new List<CharacterDebuff>();
        CharacterDebuff newDebuff = new CharacterDebuff();
        newDebuff.moveName = inputMove.moveName;
        newDebuff.playerNumber = inputPlayer;
        newDebuff.hpDrainDuration = inputMove.opHPDrainDuration;
        newDebuff.hpDrainInterval = inputMove.opHPDrainInterval;
        newDebuff.damagePerInterval = inputMove.opDamagePerInterval;
        newDebuff.currentHPDrainDuration = 0f;
        newDebuff.currentHPDrainInterval = 0f;
        playerDebuffs.Add(newDebuff);
    }

    // New Drain: own health
    if (!foundExistingSelfDebuff && inputMove.isSelfHPDrain && inputPlayer == this.playerNum) {
        if (playerDebuffs == null) playerDebuffs = new List<CharacterDebuff>();
        CharacterDebuff newDebuff = new CharacterDebuff();
        newDebuff.moveName = inputMove.moveName;
        newDebuff.playerNumber = inputPlayer;
        newDebuff.hpDrainDuration = inputMove.selfHPDrainDuration;
        newDebuff.hpDrainInterval = inputMove.selfHPDrainInterval;
        newDebuff.damagePerInterval = inputMove.selfDamagePerInterval;
        newDebuff.currentHPDrainDuration = 0f;
        newDebuff.currentHPDrainInterval = 0f;
        newDebuff.hpDrainMove = inputMove.selfHPDrainMove;
        newDebuff.hpDrainStance = inputMove.selfHPDrainStance;
        playerDebuffs.Add(newDebuff);
    }
}

// Stop Health Drain
public void StopHealthDrain(MoveInfo inputMove)
{
    foreach (CharacterDebuff debuff in playerDebuffs) {
        // Self debuffs
        if (inputMove.stopDrainingOwnHealth && debuff.playerNumber == this.playerNum) {
            debuff.currentHPDrainDuration = debuff.hpDrainDuration;
        }
        // Opponent's debuffs on self
        if (inputMove.stopOpHealthDrainFromSelf && debuff.playerNumber != this.playerNum) {
            debuff.currentHPDrainDuration = debuff.hpDrainDuration;
        }
    }
}

// Health drain
public void DrainHealth(bool resetDrain)
{
    if (!resetDrain) {
        foreach (CharacterDebuff debuff in playerDebuffs) {
            if (debuff.currentHPDrainDuration < debuff.hpDrainDuration) {
                if (debuff.currentHPDrainInterval < debuff.hpDrainInterval) {
                    debuff.currentHPDrainInterval += Time.fixedDeltaTime;
                }
                else {
                    DamageMe(debuff.damagePerInterval);
                    debuff.currentHPDrainInterval = 0f;
                }
                debuff.currentHPDrainDuration += Time.fixedDeltaTime;
                // Cast a move and/or change stance
                if (debuff.playerNumber == this.playerNum && debuff.currentHPDrainDuration >= debuff.hpDrainDuration) {
                    myMoveSetScript.ChangeMoveStances(debuff.hpDrainStance);
                    if (debuff.hpDrainMove != null) CastMove(debuff.hpDrainMove , true);
                }
            }
        }
    }
    else {
        // Starts/Resets the variable
        playerDebuffs = new List<CharacterDebuff>();
    }
}

EDIT 2: Adding Some usage example.

http://i63.tinypic.com/2crt3qb.jpg

Drain Starts On: Will trigger the drain either on move cast or when it hits the opponent.
Drain Duration: Total Duration of the drain.
Drain Interval: Damage will be applied every time it reaches this amount of time.
Damage per Interval: Damage applied at each interval.
Move : When the drain ends, will cast this move.
Stance: When the drain ends, will change to this stance.

Stop Draining Own Health: When this is marked, the move will stop any drain on yourself that was cast by you.
Stop Opponent's Health Drain on Yourself: When this is marked, the move will stop any drain on yourself that was cast by teh opponent.

The ones listed above will drain your own Health, set negative values to heal yourself.
There are options to drain the opponent's health as well, the variables that repeat have the same function as the Drain Own Health options.

Special attention to this:
Just like in the version for 1.6 I haven't thought in a way to make the intervals to work exactly as I want.
In the example given in the image, the Drain will last for 10 seconds and will apply damage each second(Interval).
The problem is that it will only trigger 9 times since when the timer "reaches" 10 seconds, it will be like 10.167 seconds and will not enter the conditions I set. To work around this, just set the duration a little higher than the intended (in the example given, 10.2 will work, since 10.2 is higher than 10.167).

That's it guys, let me know if something is not clear or if maybe I have forgotten anything.

Hello, I am having an issue in UFE 1.8 (fresh project) and unity 5.4.1f1 that while I'm playing, either versus or training mode, and I press Alt+Tab, for example, and then come back to the game, it crashes.

Error logs:

NullReferenceException: Object reference not set to an instance of an object
CameraScript.DoFixedUpdate () (at Assets/UFE/Scripts/CameraScript.cs:70)
UFE.FixedUpdate () (at Assets/UFE/Scripts/UFE.cs:2008)
NullReferenceException: Object reference not set to an instance of an object
DefaultBattleGUI.DoFixedUpdate () (at Assets/UFE/Scripts/UI/Templates/DefaultBattleGUI.cs:123)
UFE.FixedUpdate () (at Assets/UFE/Scripts/UFE.cs:2016)

EDIT:
"It has never happened to me before in 1.6, and since I believe it is more "unity related" than just c#, I'm having a little bit of trouble finding out where the problem begins."
After some tests it does happens in 1.6, an since it is still a problem in 1.8, it is in 1.7 and 1.7.1 as well.

Any help is appreciated.

39

(152 replies, posted in Showcase)

Do you have a backup of your original Character Selection Screen prefab?

If you do, try swapping your current with the old one and check if the problem persists. You might have deleted or lost reference of something during your graphics update.

If you don't I suggest you create a new project and copy/paste the Character Selection Screen prefab into your project to test this.

40

(9 replies, posted in Character Design)

Check if the normals are/aren't(not sure wich one) reversed before exporting to unity.

It may cause this "transparent" effect. It looks like the character texture is inside-out.

41

(4 replies, posted in UFE 1 (Deprecated))

EDIT 1: I created this solution for the 1.6 version. I will update this for 1.8 and create a tutorial page.

This solution will create some sort of "bleed" effect on the Enemy Player.

In MoveInfo, after:

public string description;

Add:

public bool isHealthDrain = false;
public float healthDrainDuration = 0f;
public float healthDrainInterval = 0f;
public float damagePerInterval = 0f;

======================================================================

In MoveEditorWindow, after:

moveInfo.description = EditorGUILayout.TextField("Move Description:" , moveInfo.description);

Add:

moveInfo.isHealthDrain = EditorGUILayout.Toggle("Health Drain" , moveInfo.isHealthDrain , toggleStyle);
if (moveInfo.isHealthDrain){
    moveInfo.healthDrainDuration = Mathf.Clamp(EditorGUILayout.FloatField("Health Drain Duration:" , moveInfo.healthDrainDuration),.1f,99999);
    healthDrainInterval = Mathf.Clamp(EditorGUILayout.FloatField("Health Drain Interval:" , moveInfo.healthDrainInterval),.1f,99999);
    damagePerInterval = Mathf.Clamp(EditorGUILayout.FloatField("Health Drained per Interval:" , moveInfo.damagePerInterval) ,.1f,99999);                        
}

You can remove/change the "Mathf.Clamp(" and "),.1,99999)" if you want, they are for setting the value ranges.

======================================================================

In ControlsScript after:

private float storedMoveTime;

Add:

private float healthDrainDuration;
public float currentHealthDrainDuration;
float healthDrainInterval;
float currentHealthDrainInterval;
float damagePerInterval;

Inside DoFixedUpdate() after:

ReadMove(currentMove);

Add:

DrainHealth();

Inside GetHit(), as the first thing add:

if(opControlsScript.currentMove != null && opControlsScript.currentMove.isHealthDrain){
    healthDrainDuration = opControlsScript.currentMove.healthDrainDuration;
    healthDrainInterval = opControlsScript.currentMove.healthDrainInterval;
    damagePerInterval = opControlsScript.currentMove.damagePerInterval;
    currentHealthDrainDuration = 0f;
    currentHealthDrainInterval = 0f;
}

Do the same for GetHitBlocking(), if you want to apply the same effects even when blocking.

After the shake() function, add:

EDIT 2: included the resetDrain variable to control the drain when the round ends.

public void DrainHealth(bool resetDrain){
    if (!resetDrain){
        if (currentHealthDrainDuration < healthDrainDuration){
            if (currentHealthDrainInterval < healthDrainInterval){
                currentHealthDrainInterval += Time.fixedDeltaTime;
            }
            else{
                DamageMe(damagePerInterval);
                currentHealthDrainInterval = 0f;
            }
            currentHealthDrainDuration += Time.fixedDeltaTime;
        }
    }
    else{
        healthDrainDuration = 0;
    }
}

Inside the StartNewRound() function, before:

ResetData(true);

Add:

DrainHealth(true);
opControlsScript.DrainHealth(true);

End of EDIT 2.

There is a problem with this. Time.fixedDeltaTime is not a decimal based value, because it is related to the frames per second ratio. So when I set the total duration of the health drain to 8 and the interval to 2, it only hit 3 times. I just increased the duration to 8.2 and it "worked as it should" =P.

I couldn't figure out a way to work around this without it being too much work, so I just left it as it is.

That's pretty much it. I hope that helps you as much as it helped me to understand more of his engine.

42

(3 replies, posted in UFE 1 (Deprecated))

I had the same problem some days ago. I did this to "solve" the problem:

Fill the empty linked moves with any move, save the project and close unity.

Open your project again and remove those linked moves.

Hope that helps.

43

(4 replies, posted in UFE 1 (Deprecated))

Create a Function that will control a timer, similarly to ApplyStun() in controlsScript, and call removeGauge every X seconds until the timer ends.

It is late in the night here, so if you want me to elaborate, reply or send me a PM.

44

(24 replies, posted in UFE 1 (Deprecated))

christougher wrote:

Just for the record the hit boxes do not need to be attached to bones. My weapons have empty child gameobjects placed where I want my hit boxes to be. No worrying about offsets. big_smile

How come I have never thought of that? Awesome, yet simple, idea.

45

(3 replies, posted in UFE 1 (Deprecated))

chrisb3d wrote:

I was looking at custom rules but I don't see anything that references a specific move. Although in Conditions of the custom rules I do see attack type.. I'm guessing if the move is set to that attack type the rule will apply.

That's what I meant. You can set the move to a specific type of attack that you want to apply a rule for. If you have Source or Bundle version you can even create more types to help you on this.

I don't know why I wasn't notified on your reply, so, sorry for answering this late.

Check how it is done in the Move Editor>Sound Effects:

for (int i = 0; i < moveInfo.soundEffects.Length; i++){
    //STUFF I SHOULDN'T POST IN A PUBLIC FORUM =P
}
if (StyledButton("New Sound Effect"))
    moveInfo.soundEffects = AddElement<SoundEffect>(moveInfo.soundEffects , new SoundEffect());

Adapt to where your getting hurt sound is in the editor. You can do the same for character selection sound and death sound if you wish.

You will have an array of sounds that will have one sound picked randomly by the UFE engine. Look for this:

public static void PlaySound(IList<AudioClip> sounds)

47

(24 replies, posted in UFE 1 (Deprecated))

KRGraphics wrote:

Though the hitboxes are kinda offset on player 2... any reason why it does this?

As long as those extra bones are baked into the skeleton and you turn on the transform masks. I was going to stick with generic, but I will be using humanoid big_smile

Since your bones skipped the hierarchy because of the twist bones, the hitbox script gets lost somewhere when you put some kind of offset in the hitboxes. It will not mirror the offset for p2. I had the same problem with a character's weapon that was not connected to the model.

48

(10 replies, posted in UFE 1 (Deprecated))

I Believe it is configured that way in the Global Options>Advanced Options>Frames Per Seconds.

Take a look and see if it is set to 50.

49

(4 replies, posted in UFE 1 (Deprecated))

As Haritha Denuwan said, in the Global Options>Training Mode Options you can see the life and gauge options.

Check in the code where and when RefillLife() (and RefillGauge, if you want) is used so you can do what you want. It's in ControlsScript.

You could create a new option for refill (in GlobalInfo: look for LifeBarTrainingMode) that won't allow the player's health bar to fill again when going to a new "round" or "stage".

In ControlsScript check for LifeBarTrainingMode as well, so you can have an idea of what to do.

I believe you want to (or at least should) create a new game mode. You can look what is in UFE already and code what you need to make your survival mode.

I was actually reffering to this: https://onedrive.live.com/?authkey=%21A … mp;o=OneUp, since some characters might be configured differently.