using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pin : MonoBehaviour { public enum PinType { PinGravity, PinRaise, PinStop, PinLower } public Renderer pinLight; public Game game; public GameObject splash; public float distToRaise = 40f; public bool isHitOne; private PinType type; private Ball ball; private Vector3 pinStartPos; private bool pinRaise; private bool isSplash; private bool isSpare; // Use this for initialization void Start () { pinStartPos = transform.position; transform.position = pinStartPos; transform.rotation = Quaternion.identity; GetComponent().velocity = Vector3.zero; GetComponent().angularVelocity = Vector3.zero; GetComponent().Sleep(); ball = GameObject.FindObjectOfType(); isSplash = GameObject.FindObjectOfType().isSplash; if (GameManager.pinMode != GameManager.PinMode.Spare) { pinLight.material = GameObject.FindObjectOfType().pinOn; } } // Update is called once per frame void Update () { if (GetComponent().isKinematic && pinRaise && !game.isCurrentReplay) { if (type == PinType.PinRaise) { transform.Translate(new Vector3(0, distToRaise * Time.deltaTime, 0), Space.World); } if (type == PinType.PinLower) { transform.Translate(new Vector3(0, -distToRaise * Time.deltaTime, 0), Space.World); } } } void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Ball" && !GameObject.FindObjectOfType().isGravity || collision.gameObject.tag == "Pin" && !GameObject.FindObjectOfType().isGravity) { GetComponent().useGravity = false; GetComponent().force = new Vector3(0, -15, -150); } } void OnTriggerEnter(Collider other) { if (other.CompareTag("Fall") && !GameObject.FindObjectOfType().isGravity) { GetComponent().useGravity = false; GetComponent().force = new Vector3(0, -15, -150); } Vector3 splashPosition = new Vector3(transform.position.x, other.transform.position.y, transform.position.z); if (other.CompareTag("Fall") && isSplash || other.CompareTag("Gutter") && isSplash || other.CompareTag("Water") && isSplash) { if (GameManager.isParticle) { Instantiate(splash, splashPosition, Quaternion.identity); } isSplash = false; } } public bool IsStanding() { if (transform.position.y > pinStartPos.y - 0.5f && transform.position.y < pinStartPos.y + 0.5f) { return true; } else { return false; } } public void PinDown() { if (GameManager.pinMode == GameManager.PinMode.Spare) { isSpare = true; } pinRaise = IsStanding(); PinLight(); } public void PinLight() { if (pinRaise) { pinLight.material = GameObject.FindObjectOfType().pinOn; } else { pinLight.material = GameObject.FindObjectOfType().pinOff; } } public void Raise() { if (game.throwBall < game.maxBalls) { GetComponent().isKinematic = pinRaise; } type = PinType.PinRaise; } public void Stop() { if (pinRaise) { transform.position = new Vector3(pinStartPos.x, transform.position.y, pinStartPos.z); transform.rotation = Quaternion.identity; GetComponent().velocity = Vector3.zero; } type = PinType.PinStop; } public void Lower() { type = PinType.PinLower; } public void Land() { if (GameObject.FindObjectOfType().isGravity) { GetComponent().useGravity = true; GetComponent().force = new Vector3(0, 0, 0); } GetComponent().isKinematic = false; if (pinRaise && game.throwBall < game.maxBalls) { transform.position = pinStartPos; transform.rotation = Quaternion.identity; GetComponent().velocity = Vector3.zero; GetComponent().angularVelocity = Vector3.zero; GetComponent().Sleep(); } type = PinType.PinGravity; } public void OutOfPin() { GetComponent().useGravity = true; GetComponent().force = new Vector3(0, 0, 0); GetComponent().isKinematic = false; isHitOne = false; isSplash = GameObject.FindObjectOfType().isSplash; gameObject.SetActive(pinRaise); if (pinRaise) { transform.position = pinStartPos; transform.rotation = Quaternion.identity; GetComponent().velocity = Vector3.zero; GetComponent().angularVelocity = Vector3.zero; GetComponent().Sleep(); } } public void Reset() { gameObject.SetActive(true); GetComponent().useGravity = true; GetComponent().force = new Vector3(0, 0, 0); GetComponent().isKinematic = false; isHitOne = false; isSplash = GameObject.FindObjectOfType().isSplash; transform.position = pinStartPos; transform.rotation = Quaternion.identity; GetComponent().velocity = Vector3.zero; GetComponent().angularVelocity = Vector3.zero; GetComponent().Sleep(); pinLight.material = GameObject.FindObjectOfType().pinOn; } public void ResetFall(int isPinFall) { GetComponent().useGravity = true; GetComponent().force = new Vector3(0, 0, 0); isHitOne = false; isSplash = GameObject.FindObjectOfType().isSplash; if (isSpare) { transform.position = pinStartPos; } transform.rotation = Quaternion.identity; GetComponent().velocity = Vector3.zero; GetComponent().angularVelocity = Vector3.zero; GetComponent().Sleep(); if (isPinFall != 0) { gameObject.SetActive(true); pinLight.material = GameObject.FindObjectOfType().pinOn; } else { gameObject.SetActive(false); pinLight.material = GameObject.FindObjectOfType().pinOff; } } }