Skip to content

Latest commit

 

History

History
223 lines (184 loc) · 6.4 KB

player.md

File metadata and controls

223 lines (184 loc) · 6.4 KB

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

public class player : MonoBehaviour { //定义刚体组件 private Rigidbody m_RigidBody;

public float fMaxForce = 500.0f;
private float m_CurForce = 0.0f;

public GameObject Box=null ;
public float fMinDistance = 1.2f;
public float fMaxDistance = 3.0f;
public float fMinHeight = 0.3f;
public float fMaxHeight = 2.0f;

private Vector3 m_Direction = Vector3.forward;
private float m_Distance = 0.0f;
private float m_Height = 0.0f;

private GameObject m_CurCube = null;
private GameObject m_NextCube = null;

// private int m_Score = 0;

private Vector3 m_CameraOffest = Vector3.zero;
private GameObject m_Plane = null;

private Animator m_Animator = null;

private UIManager m_UI = null;


private AudioSource m_AudioPlay = null;
public AudioClip PressAudio = null;
public AudioClip JumpAudio = null;
public AudioClip DownAudio = null;
// Start is called before the first frame update
void Start()
{
    //获取模板函数
    m_RigidBody = GetComponent<Rigidbody>();
    m_Animator = GetComponent<Animator>();
    m_UI = GetComponent<UIManager>();
    m_AudioPlay = GetComponent<AudioSource>();
    m_Plane = GameObject.FindGameObjectWithTag("Plane");
    m_NextCube = GenerateBox();
}

// Update is called once per frame
void Update()
{
    
    GameObject obj = GetHitObject();
    if (obj != null)
    {
        if (obj.tag == "Cube")
        {
            if (m_CurCube == null)
            {
                PlayAudio(DownAudio);
                m_CurCube = obj;//游戏刚刚开始
                m_CameraOffest = Camera.main.transform.position - m_CurCube.transform.position;
            }
            else  if (m_NextCube == obj)
            {
                PlayAudio(DownAudio);                               
                m_UI.SetPowerShow(true);
                Destroy(m_CurCube);
                m_CurCube = m_NextCube;
                AddScore();
                m_NextCube = GenerateBox();
                m_RigidBody.Sleep();
                m_RigidBody.WakeUp();
                m_Animator.SetBool("Forward", false);
                m_Animator.SetBool("Left", false);

            }
            ProcessInput();
            ShowScale();

            MoveCameraAndPlane();
        }
        else  if(obj.tag=="Plane")
        {
            m_UI.SetGameOver(true);
        }
    }
    
}

private void AddScore()
{
    Vector3 offest = m_CurCube.transform.position - transform.position;

    offest.y = 0;

    if(offest.sqrMagnitude < 0.2f )
    {
        m_UI.AddScore(2);
    }
    else
        m_UI.AddScore(1);
}

private void ProcessInput()
{
    if (Input.GetMouseButtonDown(0))
    {
        PlayAudio(PressAudio);
    }
    else if (Input.GetMouseButton(0))
    {
        m_CurForce += Time.deltaTime * fMaxForce/2.0f;
        if (m_CurForce > fMaxForce)
        {
            m_CurForce = fMaxForce;
        }
    }
    else if (Input.GetMouseButtonUp(0))
    {
        Jump();
        m_CurForce = 0.0f;
        m_UI.SetPowerShow(false);
    }
    m_UI.ShowPower(m_CurForce, fMaxForce);
}

private void MoveCameraAndPlane()
{
    Camera.main.transform.position = Vector3.Lerp(Camera.main.transform.position,
        m_CurCube.transform.position+m_CameraOffest,Time.deltaTime*2);


    Vector3 pos = m_CurCube.transform.position;
    pos.y = 0;
    m_Plane.transform.position = pos;
}

//蓄力表现
private void ShowScale()
{
    float sc = (fMaxForce - m_CurForce * 0.5f) / fMaxForce;
    Vector3 scale = transform.localScale;
    scale.y = sc * 0.2f;
    transform.localScale = scale;
}

private void Jump()
{
    PlayAudio(JumpAudio);
    m_RigidBody.AddForce(Vector3.up * m_CurForce);
    Vector3 dir = m_NextCube.transform.position - transform.position;
    dir.y = 0;
    m_RigidBody.AddForce(dir.normalized * m_CurForce);
    if (m_Direction == Vector3.forward)
        m_Animator.SetBool("Forward", true);
    else
        m_Animator.SetBool("Left", true);

    
}

private GameObject GenerateBox()
{
    GameObject obj = GameObject.Instantiate(Box);

    m_Distance = Random.Range(fMinDistance, fMaxDistance);
    m_Height = Random.Range(fMinHeight, fMaxHeight);
    m_Direction = Random.Range(0, 2) == 1 ? Vector3.forward : Vector3.left;

    Vector3 pos = Vector3.zero;
    if (m_CurCube == null)
        pos = m_Direction * m_Distance + transform.position;
    else
        pos = m_Direction * m_Distance + m_CurCube.transform.position;

    pos.y = 2.0f;
    obj.transform.position = pos;

    obj.transform.localScale = new Vector3(1, m_Height, 1);

    obj.GetComponent<MeshRenderer>().material.color = new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f));

    return obj;
}


private GameObject GetHitObject()
{
    RaycastHit hit;
    Vector3[] vOffests = { Vector3.zero,Vector3.forward, Vector3.back, Vector3.left, Vector3.right };
    foreach (Vector3 vof in vOffests)
    {
        if (Physics.Raycast(transform.position + vof * 0.1f, Vector3.down, out hit, 0.3f))
        {
                Debug.Log(hit.collider.tag);
                return hit.collider.gameObject;
        }
    }
    

    return null;
}

private void OnDrawGizmos()
{
    Gizmos.color = Color.red;
    Vector3[] vOffests = { Vector3.zero, Vector3.forward, Vector3.back, Vector3.left, Vector3.right };
    foreach (Vector3 vof in vOffests)
    {
        Gizmos.DrawLine(transform.position + vof * 0.1f, transform.position + vof * 0.1f+Vector3.down*0.3f);
    }
}

private void PlayAudio(AudioClip clp)
{
    m_AudioPlay.Stop();
    m_AudioPlay.clip = clp;
    m_AudioPlay.Play();
}

}