using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;//用于场景重置(第21节视频)
public class PlayerContronller : MonoBehaviour
{
public Rigidbody2D rb;
//获取一个2D刚体,名字为rb
public float speed;
//获取浮点型的“速度”(带有小数点的)
public Collider2D coll;
//获取一个2D瓦片地图碰撞器,名为coll
public Collider2D DisColl1;
//public Collider2D DisColl2;
//privat epublic Rigidbody2D rb; //设置私有的,(public公开的),在unity看不到选项的
//public Rigidbody2D rb;//
public float JumpForce;
//获取跳跃,名为jumpforce
public Animator anim;
//获取动画器,名为anim
public LayerMask ground;
//获取图层,名为ground。需要把之前的瓦片地图定义为ground
[SerializeField]//这行代码可观察到cherry的变化
public int cherry;
//获取一个整数樱桃数量
public Text cherryNum;
//获取文本,用于获得樱桃的数量
public bool isHurt;//布尔值默认是false
//设置布尔值,如果受伤了,就不执行下面的内容(全部)
public bool isGround;//检查是否踩在地面
private int extraJump;
//public AudioSource jumpAudio;
//public AudioSource eatAudio;
//public AudioSource hitAudio;
public Transform CellingCheck,GroundCheck;//判断顶点位置,地面点位置
public Joystick joystick;//触控(暂不用)
void Start()//播放开始的时候会执行中括号里的内容(Start可以做一些初始化的事情)
{
// rb = GetComponent<Rigidbody2D>(); //设置私有的,在unity看不到选项的
}
//void Update()//原本使用Update()。所有每一帧的变化都会在Update里面(Update是循环,每帧都会调用)
void FixedUpdate()//FixdedUpdate(),固定每一帧的变化,在不同配置的电脑上获得同样的手感,
{
if (!isHurt)
//
{
Movement();//为了在画面播放时Movement都能被调动
}
SwithAnim();
isGround = Physics2D.OverlapCircle(GroundCheck.position, 0.2f, ground);
//检测范围里的碰撞器,是GroundCheck点的左边,误差在0.2f左右,判断的是ground
}
private void Update()
{
//jump();//暂不用
crouch();
cherryNum.text = cherry.ToString();
newJump();
}
/// /
void Movement()//设置一个函数名为Movement(函数的基本类型),可在这里添加左右移动,跳跃,蹲...
{
float horizontalMove = Input.GetAxis("Horizontal");
//定义一个浮点型,名为horizontalmove
//获取横向移动"Horizontal","Horizontal"只有三个参数,-1、0、1(向左/不动/向右)。
//horizontalmove就等于这个参数
//Input是玩家可以自己选择的按键
//手机触控------------
//float horizontalMove = joystick.Horizontal;//-1~1f
//float facedircetion = joystick.Horizontal;
//手机触控------------
float facedircetion = Input.GetAxisRaw("Horizontal");
//定义一个浮点型,名为facedircetion(方向)。GetAxisRaw直接获得-1、0、1,而GetAxis是-1到0。
//角色移动
// if (horizontalMove != 0)
if (horizontalMove != 0 && !anim.GetBool("crouching"))
//做一个判断的函数if,“()”里面写的是条件,不等于0的时候
{
rb.velocity = new Vector2(horizontalMove * speed * Time.fixedDeltaTime, rb.velocity.y);
//施加力量改变刚体rb的速度(velocity,速度的变化),Vector2是xy轴的变化(Vector3是3D层面的变化)
//horizontalmove只有正负,乘以速度speed。y轴没变。
//speed乘以物理时钟的运行的百分比,所以能在不同的设备上都可以获得一个很平滑,不跳帧的一个运动方式
//移动动画
anim.SetFloat("running", Mathf.Abs(horizontalMove));
//获取动画控制器里的running,
//由于动画器那边设置了条件(移动的条件为大于或少于时播放什么动画)
//所以用Abs(数学上的绝对值)
//归0默认是idea
}
//蹲着走
if (horizontalMove != 0 && anim.GetBool("crouching"))
{
rb.velocity = new Vector2(horizontalMove * speed / 2 * Time.fixedDeltaTime, rb.velocity.y);
//施加力量改变刚体rb的速度(velocity,速度的变化),Vector2是xy轴的变化(Vector3是3D层面的变化)
//horizontalmove只有正负,乘以速度speed。y轴没变。
//speed乘以物理时钟的运行的百分比,所以能在不同的设备上都可以获得一个很平滑,不跳帧的一个运动方式
//移动动画
anim.SetFloat("running", Mathf.Abs(horizontalMove));
//获取动画控制器里的running,
//由于动画器那边设置了条件(移动的条件为大于或少于时播放什么动画)
//所以用Abs(数学上的绝对值)
//归0默认是idea
}
//角色方向
//---------------------------
if (facedircetion != 0)
{
transform.localScale = new Vector3(facedircetion, 1, 1);
}
//---------------------------
//手机触控------------
//if (facedircetion > 0f)
//{
// transform.localScale = new Vector3(1, 1, 1);
//}
//if (facedircetion < 0f)
//{
// transform.localScale = new Vector3(-1, 1, 1);
//}
//手机触控------------
//“转换”里面的“缩放”里,x轴变-1为向左,1为向右,y和z轴不变
角色跳跃
//if (Input.GetButtonDown("Jump")&& (coll.IsTouchingLayers(ground))&&!anim.GetBool("crouching"))
判断,获取到键盘上一个键“Jump”被按下的时候
//{
// rb.velocity = new Vector2(rb.velocity.x, JumpForce * Time.deltaTime);
// //y轴向上有jumpforce乘以物理时钟的速度,x轴仍然是左右移动
// anim.SetBool("jumping", true);
// //当得知跳跃起来时,动画变为jumping(只有向上跳的定格动画1帧图)
// jumpAudio.Play();
//}
//crouch();
}
//希望降下来有降下来的动画效果
void SwithAnim()
//切换动画。单独写一个函数,名为SwithAnim
{
//anim.SetBool("idle", false);
//不需要,因为idle是默认的
if (rb.velocity.y<0.1f &&!coll.IsTouchingLayers(ground))
{
anim.SetBool("falling", true);
}
//首先要跳起来才有降下来的动画
//所以先判断是否跳跃
if (anim.GetBool("jumping"))
//要进一步判断,什么时候进行动画
{
//anim.SetBool("idle", false);
//不需要,因为idle是默认的
if (rb.velocity.y < 0)
//跳跃的时候,当y轴的力(jumpforce)没了,就下降了
{
anim.SetBool("jumping", false);
anim.SetBool("falling", true);
//此时有起跳和下降的动画,但不会还原
//当上面的语句不成立,将执行下面的语句
}
}
else if (isHurt == true)
{
anim.SetBool("hurt", true);
anim.SetFloat("running", 0);
//给他一个值为0,让他停下
if (Mathf.Abs(rb.velocity.x) < 0.1f)
{
anim.SetBool("hurt", false);
//anim.SetBool("idle", true);
//不需要,因为idle是默认的
isHurt = false;
}
}
else if (coll.IsTouchingLayers(ground))
//当 碰撞接触到地面groud时
{
anim.SetBool("falling", false);
//anim.SetBool("idle", true);
//不需要,因为idle是默认的
}
//要在两个动画之间的连线处设置jumping为true,
//代码setbool就是设置jumping 的值,值一样动画就可以切换过去了
//群友解释
}
//触发器
private void OnTriggerEnter2D(Collider2D collision)
//括号里的内容只被这个函数调用,而不是全局的变量参数
{
//收集樱桃
//樱桃属于Collection的这个标签
if (collision.tag == "Collection")
{
//eatAudio.Play();
//Destroy(collision.gameObject);
//cherry += 1;
collision.GetComponent<Animator>().Play("isGot");
//获取collision的动画,播放名为"isGot"的动画
//cherryNum.text = cherry.ToString();
//已剪切到Updata,使得更新没有延迟
//注意!!虽然是调用了cherrtNum,但调用的是他的[文本]而不是它本身!
//直接写=cherry会报错,提示:无法将类型int转化为string,这时需要加上.ToString()
}
if (collision.tag == "DeathLine")
{
Invoke("Restart", 2f);
}
}
//消灭敌人
private void OnCollisionEnter2D(Collision2D collision)
{
//if (anim.GetBool("falling")&&(collision.gameObject.tag == "Enemies"))
if (collision.gameObject.tag == "Enemies")
//获取跳跃,是真就执行,是假就不执行
{
Enemy enemy = collision.gameObject.GetComponent<Enemy>();
//if (collision.gameObject.tag == "Enemies")
// 如果直接像收集樱桃写collison.tag是会报错的,
//因为onTriggerEnter2D和OnCollisionEnter2D是两个完全不同的调用系统
//所以要先获得Enemise这个项目
if (anim.GetBool("falling"))
{
//Destroy(collision.gameObject);不用这个已被下面的语句代替
enemy.JumpOn();
rb.velocity = new Vector2(rb.velocity.x, 200 * Time.deltaTime);
//踩了就跳一下
anim.SetBool("jumping", true);
//再来一段小跳
}
else if (transform.position.x < collision.gameObject.transform.position.x)
{
//hitAudio.Play();
SoundMananger.instance.HurtAudio();
rb.velocity = new Vector2(-5, rb.velocity.y);
// rb.velocity = new Vector2(rb.velocity.x, 300 * Time.deltaTime);
isHurt = true;
}
else if (transform.position.x > collision.gameObject.transform.position.x)
{
//hitAudio.Play();
SoundMananger.instance.HurtAudio();
rb.velocity = new Vector2(-5, rb.velocity.y);
// rb.velocity = new Vector2(rb.velocity.x, 300 * Time.deltaTime);
isHurt = true;
}
}
}
//蹲下
void crouch()
{
if (!Physics2D.OverlapCircle(CellingCheck.position,0.2f,ground))
{
if (Input.GetButton("Crouch"))
{
anim.SetBool("crouching", true);
DisColl1.enabled = false;
//DisColl1这个选项被关闭
} else
{
anim.SetBool("crouching", false);
DisColl1.enabled = true;
//DisColl1这个选项被关闭
}
}
}
//角色跳跃
/*void jump()
{
if (Input.GetButtonDown("Jump") && (coll.IsTouchingLayers(ground)) && !anim.GetBool("crouching"))
//判断,获取到键盘上一个键“Jump”被按下的时候
{
rb.velocity = new Vector2(rb.velocity.x, JumpForce * Time.deltaTime);
//y轴向上有jumpforce乘以物理时钟的速度,x轴仍然是左右移动
anim.SetBool("jumping", true);
//当得知跳跃起来时,动画变为jumping(只有向上跳的定格动画1帧图)
jumpAudio.Play();
}
}*/
void newJump()
{
if (isGround)
{
extraJump = 1;
}
if (Input.GetButtonDown("Jump") && extraJump > 0)
{
rb.velocity = Vector2.up * JumpForce;//new Vector2 (0,1)
extraJump--;// -1
anim.SetBool("jumping", true);
SoundMananger.instance.JumpAudio();
}
if (Input.GetButtonDown("Jump") && extraJump == 0 && isGround)
{
rb.velocity = Vector2.up * JumpForce;
anim.SetBool("jumping", true);
SoundMananger.instance.JumpAudio();
}
}
void Restart()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
//重新加载场景(读取获得当前场景的名字)
}
public void CherryCount()
//public是为了其他文件能调用它
{
cherry += 1;
}
}
PlayerContronller(玩家控制)
最新推荐文章于 2023-01-25 20:14:20 发布