Skip to content

Unsolicited TA Advice #82

@evan-erdos

Description

@evan-erdos

Hi guys, this is just my feedback, not a graded assessment or a real problem.
As a general rule, my Tactful and Well-Considered Advice® is just that: advice.
Neither my opinions nor I have any impact on your grade, so don't worry about it.
Also, it's a fun interactive checklist! Go for it! Check things off!

  • Get some real fancy ball effects on up in there!
    If you add a light and some fancy 3D shimmer to your ball,
    you'll know exactly where it is, all day, every day.
    You maybe want to put a trail on the ball too, to track your shots.

  • Get some dust motes up in there!
    This may appear to be some silly irrelevant toy, but it's extremely useful.
    It's a title shot outdoors in the ballpark, just like everything by keijiro.
    You could use it to faintly indicate the wicket's force-fields,
    and you should absolutely use it to alert the player to gravity switches.
    It has a velocity parameter, change it with gravity for a cool look.
    For vacuum, you may have to hack it so it converges, maybe time = -time?
    I can't think of anything better to indicate depth than dust motes.

  • Gotta get that Spaceship HDR Bloom glow happening in here!
    Good old Channel Nº 3: PostProcessing, the Space Station essential.
    The radius of the bloom effect is proportional to emissive intensity,
    so if you want something to really stand out, crank it way up.

  • Did you know that OnTriggerStay can be run as a coroutine?
    I think your physics woes stem from their being reduced to atomic events,
    whereas the interaction should be taking place over a span of time.
    You could kill two birds with one stone and also apply haptics here, too.

    IEnumerator OnTriggerStay(Collider other) {
        while (other.attachedRigidbody?.name=="Ball") {
            yield return new WaitForFixedUpdate();
    
            // apply haptics over time
            // intensity => 0 as t0+dt => t0+n for n second delay
    
            // apply forces to the ball multiplied by fixedDeltaTime
            // maybe realign ball velocity to mallet forward
    
            // play sound or maybe restart or stop sound, play with volume
            // maybe pitch depends on how orthogonal the mallet is
            // maybe play a "great hit" sound if they're really lined up
    
        }
    }
  • Template Strategy Software Design Pattern + AnimationCurves!
    I'll cover more about software design soon, but for user testing,
    you should set up a bunch of profiles and see what works best.
    The animation curves can be serialized in the editor, i.e.,
    they can be stored in a ScriptableObject and changed at runtime.
    Generalize your physics computation as a function delegate type,
    so that you can swap out different algorithms on the fly.
    The following is definitely for example purposes only.

    // define your delegate type
    delegate void CroquetPhysicsAlgorithm(
        Vector3 ballPosition,
        Vector3 ballVelocity,
        Vector3 ballAngularVelocity,
        Vector3 malletVelocity,
        Vector3 malletForward,
        ...
        AnimationCurve ballHitForceResponseCurve,
        AnimationCurve whateverElseCurve);
    
    ...
    
    // map from identifiers to functions to swap in and out
    Dictionary<string,CroquetPhyicsAlgorithm> algorithms = new[] {
        // fancy C#6 dictionary syntax, enable .NET 4.6 preview!
        ["MyAlgorithm"] = new CroquetPhysicsAlgorithm(MyAlgorithm),
        ["LambdaAlgorithm"] = (bP, bV, ...) => SomeOtherComputation(2*vB)*mV,
        ...
        ["LastTry"] = new CroquetPhysicsAlgorithm(LastTryVariationFinal2) };
    
    // current function to be called from physics
    CroquetPhysicsAlgorithm CurrentAlgorithm = MyDefaultAlgorithm;
    
    ...
    
    // calling the currently selected function
    void OnCollision(Collision o) {
        CurrentAlgorithm(ball.position, ball.velocity, ... CurrentForceCurve);
    }

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions