CS2335
Master_v2
Master_v2
  • Introduction
  • Introduction
    • Introduction
      • Design
      • Game Design
    • Unity - Download
    • Visual Studio - IDE
    • Hero's Journey
  • Unity Basics
    • Unity Editor Windows
    • MonoBehavior - Base-Class
    • Unity Engine - Event Functions
  • Getting Started
    • UI-Elements
    • Animator Controller
      • Animation Steps
    • PlayerController Flow Chart
    • PlayerController Code
      • PlayerController - V1 - S20
      • PlayerController V2 S20
      • PlayerController V3 S20
  • Project 1 - Simple Game
    • Overview
    • Project 1 - Get Started
      • UML Class Diagram
    • Player GameObject
      • PlayerController.cs V2
      • PlayerController.cs V3
    • Create 2D Sprite Prefab: Rock
    • Sorting Layers
  • Project1 Code
    • PickUp PreFabs
    • Player GameObject
    • PlayerController - jump
    • GameData Version1
    • PlayerStats Version1
    • MiniGameManager
      • Logic Diagram
    • Simple Spawner
    • Utility Class
  • Project1 Enhancements
    • PickUp - SelfDestruct
    • Spawn from List of Prefabs
  • Project 2 - StateManager
    • Project 2 - Learning Objectives
    • Project 2 - Starter Assets
    • Project 2
      • State Machine Framework
        • Singleton Pattern
      • StateManager - Singleton Design Pattern
      • IStateBase, BeginState
      • Project 2 -Steps: Create new Scene and State
      • Project 2 - List of Steps
        • Project 2 - Starter Code
  • Project 2 -Dialog
    • Hide_Show_Panel Script
    • Configure TitlePanel, DecisionPanel
    • Simple Dialog Prefab
    • Conversation Scriptable Objects
    • DialogManager_ConvList
    • Image Transitions for Buttons
  • UI Components
    • Finding Game Objects
    • Game Objects: UI vs. 2D Sprite
    • UI Elements
      • Canvas: Screen-Space Render-Mode
      • UI-Buttons To Change Scene
      • Text Input
  • Project2 Resources
    • Visual Novel in Unity-Links
    • Scriptable Object Factory
      • ScriptableObjects
    • Dialog Prefab Packages
  • Project 3 - Overview
    • Branching Story Structures
    • Dictionary Data-Structure
      • Unity PlayerPrefs Dictionary
    • Dictionary: User-Choice Data
      • User-Choices - Example
        • Dictionary Value to Disable Options
    • Simplified Mini-Game
      • PlayerController_v2 Mods
        • PlayerController_v2_final
      • MiniGameManager_v2
  • Proj3: Inventory System
    • Inventory-System
      • Install and Configure
      • Diagrams, Resources
        • Item, Gem, Potion Classes
        • Inventory Class
      • InventoryDisplay, Slot UI
        • InventoryDisplay Class
        • Slot Class
        • Hazard Class
        • Layout Groups
      • Customization Steps
        • Configure Animation
        • AddItem Button
        • Concrete Class: Food
        • MiniGame Mods
          • PlayerController Mods
      • Code: InventorySystem
        • GameData, PickUp Mods
      • Resources: Data Structures
  • Proj3: Custom UnityEvents
    • Event Publishing Patterns
    • Custom Event Messaging
  • Proj3: Mini-Game
    • MiniGame-Overview-Proj3
    • LevelManager
      • LevelManager Logic Diagram
      • LevelManager FSM
      • LoadLevel, StartLevel Logic
      • Code Framework
    • Timer
  • Project 3 - Code Mods
    • Project 3 - Steps
    • Project 3 - Code
      • Code: Final Versions
        • PlayerController Mods
          • PlayerController_v2 Mods
        • GameData - Final
        • LevelManager
        • PlayerStats - Final
        • PickUp, Hazard, ScorePickUp
        • Spawner - Final
        • CameraFollow
        • ScreenFader
        • MiniGameState
        • Example: EndState
      • MiniGameWin Logic
  • Optional, Supplemental Content
    • Optional Content
      • Adding Audio
      • Screen Fading and Reloading
      • ScriptableObjects
      • Disable Debug Logging
      • Events and Actions
      • Saving Data - Serialization
      • Parallax Scrolling
      • Change Sprites
  • C# Language
    • C# Language
      • Variables
      • Enum
      • Encapsulation
        • C# Properties
        • Access Modifiers
      • Inheritance
      • Polymorphism
      • Interface
      • Switch-Case
      • List< T >
      • Queue< T >
      • Dictionary
      • Foreach
      • Static
      • Ternary Operator: ?
      • this
      • Delegates
    • Diagrams
      • State Machine Framework
      • UML Class Diagrams
      • Level Manager Logic Diagram
      • Flow-Chart: NumberGame
      • FSM: NumberGame
    • Glossary
    • References and Resources
    • Random Thoughts
Powered by GitBook
On this page

Was this helpful?

  1. Project 3 - Code Mods
  2. Project 3 - Code
  3. Code: Final Versions
  4. PlayerController Mods

PlayerController_v2 Mods

Important: This code is to be used with the Simplified MiniGame. In LevelManager, the script component of type: PlayerController is used, you must make a change to LevelManager, so it uses PlayerController_v2, or change the name of this file, and class to PlayerController.cs

Includes Updates for: InventorySystem, LevelManager.

OnTriggerEnter2D contains code to test for collisions with GameObjects with Collider2D set as 'Trigger' based on several different gameObject tags Tags used in PlayerController :

  • Collectible

    • Requires either PickUp.cs or ScorePickUp.cs

    • PickUp.cs requires ItemInstance - ScriptableObject - adds value to Score, adds ItemInstance to Inventory

    • ScorePickUp.cs - adds value to score

  • Hazard

    • Requires either PickUp.cs or Hazard.cs

  • Water

    • Invokes: onPlayerDied

  • Exit

    • Invokes: onReachedExit

Audio clips played if colliding with Pickup with correct audioSource. ( Collectible, Water )

Audio Clips:

Contains custom Events, LevelManager is the subscriber object:

  • onPlayerReachedExit

  • onPlayerDied

Updated Apr 22, 2019

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;


/// Player controller v2.
/// Code provided 
/// Sp.2019

public class PlayerController_v2 : MonoBehaviour
{
    public UnityEvent onPlayerReachExit = new UnityEvent();
    public UnityEvent onPlayerDied = new UnityEvent();
    public Transform spawnPoint; //player respawn position for each new level


    private Rigidbody2D rb2D;  //declare the variable
    public float forceX = 50f;  //this is probably too small
    private bool facingRight;

    public bool grounded; //tracks if player is touching ground
    private bool jump;  //has jump key (spacebar been pressed - last)
    public Transform groundCheck; //set in inspector, (add child to player - empty gameObject at player's feet)
    public LayerMask groundLayer;  //set in inspector
    public float groundCheckRadius = 0.2f;  //modify as needed
    public float jumpForce = 8f; //modify as needed

    // Use this for initialization
    void Start()
    {
        gameObject.transform.localPosition = spawnPoint.localPosition;
        rb2D = GetComponent<Rigidbody2D>();   ///we made the connection with the component
        facingRight = true;
    }

    //Fixed Update is called at regular time intervals - use with Physics2D
    void FixedUpdate()
    {
        float inputX = Input.GetAxis("Horizontal");  //-1, 0, 1
        bool isWalking = Mathf.Abs(inputX) > 0;

        grounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);

        bool jumpPressed = Input.GetButtonDown("Jump"); //spacebar was last key pressed

        if (jumpPressed)
        {
            jump = true;
        }
        else
        {
            jump = false;
        }

        if (isWalking)
        {

            if (inputX > 0 && !facingRight)
            {
                Flip();
            }
            else if (inputX < 0 && facingRight)
            {
                Flip();
            }
            rb2D.velocity = new Vector2(0, rb2D.velocity.y);
            rb2D.AddForce(new Vector2(inputX * forceX, 0));
        } //end if isWalking

        if (jump && grounded)
        {
            rb2D.velocity = new Vector2(rb2D.velocity.x, 0); //zero out velocity.y, maintain velocity.x
            rb2D.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse); //add force as impulse

        }

    }

    /// <summary>
    /// THIS IS THE EVENT that starts the chain reaction of events
    /// </summary>
    /// <param name="collision">Collision.</param>
    //Customize to your game needs
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.CompareTag("Collectible"))
        {
            //update score
            PickUp item = collision.GetComponent<PickUp>();
            if (item != null)
            {
                GameData.instanceRef.Add(item.Value); //points for each specific item's value

                //add to inventory
                GameData.instanceRef.AddItem(item.itemInstance); //points for each specific item's value
            }
            else //is it a scoreItem
            {
                ScorePickUp scoreItem = collision.GetComponent<ScorePickUp>();
                if (scoreItem != null)
                {
                    GameData.instanceRef.Add(item.Value); //points for each specific item's value
                }
            }
            AudioSource collectSound = collision.gameObject.GetComponent<AudioSource>();
            if (collectSound != null)
            {
                AudioClip clip = collectSound.clip;
                //plays a clip at a point in worldspace, destroyed when done
                AudioSource.PlayClipAtPoint(clip, new Vector3(5, 1, 2));
            }

            Destroy(collision.gameObject);
        }
        else if (collision.CompareTag("Hazard"))
        {
            //decrease health
            Hazard hItem = collision.GetComponent<Hazard>();
            if (hItem != null)
            {
                GameData.instanceRef.TakeDamage(hItem.Value);
            }
            else //PickUp with Hazard, not added to Inventory here
            {
                PickUp item = collision.GetComponent<PickUp>();
                if (item != null)
                {
                    GameData.instanceRef.TakeDamage(item.Value);
                }
                Debug.Log("Hit Hazard: value is " + item.Value);
            }
            Destroy(collision.gameObject);
        }
        else if (collision.CompareTag("Water"))
        {
            Debug.Log("Hit Water");
            AudioSource diedSound = collision.gameObject.GetComponent<AudioSource>();
            if (diedSound != null)
            {
                AudioClip clip = diedSound.clip;
                //plays a clip at a point in worldspace, destroyed when done
                AudioSource.PlayClipAtPoint(clip, new Vector3(5, 1, 2));
            }
            if (onPlayerDied != null) //there are listeners
            {
                onPlayerDied.Invoke();
            }
        }
        else if (collision.CompareTag("Exit"))
        {
            Debug.Log("Hit Exit");
            onPlayerReachExit.Invoke();
        }
        else
        {
            Debug.Log("Hit Something Else");
        }
    } //end function

    private void Flip()
    {
        facingRight = !facingRight; //toggle this value
        Vector3 theScale = transform.localScale;
        theScale.x *= -1;  //we have changed the value
        transform.localScale = theScale;

    }

} //end Class
PreviousPlayerController ModsNextGameData - Final

Last updated 5 years ago

Was this helpful?