using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class PlayerController : MonoBehaviour
{
private Rigidbody2D rb;
public float speed;
public float jumpforce;
private Animator anim;
public LayerMask Ground;
public Collider2D coll;
public CircleCollider2D coll2;
public int Cherry;
private bool isHurt = false;//默认false,即使不赋值
//创建一个text实例化对象(using UnityEngine.UI;)
public Text CheeryNum;
//接着会在检查工具里出现cheerynum这个对象
//将number拖进去
// Start is called before the first frame update
void Start()
{
rb = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
void Update()
{
if (!isHurt)
{
Movement();
}
//如果单纯用这样一个语句来判断
//后续的内容没有将isHurt变为false的条件
//因此我们需要动点手脚
SwitchAnim();
truehurt();
}
void truehurt()
{
if (Mathf.Abs(rb.velocity.x) < 0.1f)
{
isHurt = false;
anim.SetBool("hurt", false);
}
}
void Movement()
{
float horizontalmove;
float direction = Input.GetAxisRaw("Horizontal");
//和GetAxis不同的是,这个只获取-1 || 0 || 1 这三个整数
// Input.GetAxis 当按下你设置的建则会返回一个类似加速度的值
horizontalmove = Input.GetAxis("Horizontal");
//-1 向左, 1向右,0就是不动
//角色移动
if (horizontalmove != 0)
{
rb.velocity = new Vector2(horizontalmove * speed * Time.deltaTime, rb.velocity.y);
//刚体的速度 = Vector2 (X轴上速度的变化[方向*速率*物理时钟运行百分比=速度],Y轴上速度的变化)
// (2D平面上的速度变化)
//对anim中的running变量(刚刚在unity创建的)设置一个值
anim.SetFloat("running", Mathf.Abs(direction));
//为了避免向右向左等改变方向使得值变成负值,我们需要绝对值操作
}
if (direction != 0)
{
transform.localScale = new Vector3(direction, 1, 1);
//因为这个localscale包含三个维度的值
}
//角色跳跃
if (Input.GetButtonDown("Jump") && coll2.IsTouchingLayers(Ground))
{
rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
anim.SetBool("jumping", true);
}
}
void SwitchAnim()
{
anim.SetBool("idle", false);
//进入switchanim中,要首先将idel设置为false。具体看下文
if (anim.GetBool("jumping"))
{
if (rb.velocity.y < 0)
{
anim.SetBool("jumping", false);
anim.SetBool("falling", true);
}
}
else if (coll2.IsTouchingLayers(Ground))
{
anim.SetBool("falling", false);
anim.SetBool("idle", true);//如果只是设置这一句的话,当他掉落地面后会一直保持idel为true的效果
//因此进入switchanim中,要首先将idel设置为false
}
}
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "Collection")
{
Destroy(collision.gameObject);
Cherry = Cherry + 1;
CheeryNum.text = Cherry.ToString();
}
}
//对于触发敌人的效果,不能使用on trigger,因为敌人是一直接触地面的
//如果使用,那么敌人就会立刻由于触碰地面而消失
private void OnCollisionEnter2D(Collision2D collision)
//这个内置的参数就是碰撞体
{
//游戏角色碰撞到敌人是大条件
if (collision.gameObject.tag == "Enemey")
{
if (anim.GetBool("falling"))
{
Destroy(collision.gameObject);
rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
anim.SetBool("jumping", true);
}
//如果游戏角色在青蛙的左侧
else if (transform.position.x < collision.gameObject.transform.position.x)
{
//创建一个新速度向量
rb.velocity = new Vector2(-10, rb.velocity.y);
//但是注意,在movement class里面
//速度是不断的刷新的,所以很难会执行上述代码(线程冲突?)
//因此需要在update中判断一下是否执行movement动作
anim.SetBool("hurt", true);
isHurt = true;
}
// 如果游戏角色在青蛙的右侧
else if (transform.position.x > collision.gameObject.transform.position.x)
{
rb.velocity = new Vector2(10, rb.velocity.y);
anim.SetBool("hurt", true);
isHurt = true;
}
}
}
}