玩家控制脚本(优化)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayerController : MonoBehaviour
{
// [SerializeField] ------写在private前,使私有界面可视化
private Rigidbody2D rb;
private Animator anim;
public float speed;
public float jumpforce;
[Space]
public LayerMask ground;//获取地面信息
public Collider2D coll;
[Space]
public int Cherry;
public Text CherryNum;
private bool isHurt;//默认是false
public AudioSource boom,JumpAudio,CollectionAudio,HurtAudio;
public GameObject Death;
public Collider2D DisColl;
public Transform CeilingCheck;
// Start is called before the first frame update
void Start()
{
rb = GetComponent();//获取Component组件
anim = GetComponent();
}
// Update is called once per frame
//根据每一秒的实际帧数来平滑动画效果---兼容其他电脑
void FixedUpdate()
{
if(!isHurt)
{
Movement();
}
SwitchAnim();
}
void Movement()
{
//GetAxis --- 获得 -1到1 这三个数字包括其中所有的小数
float horizontalmove = Input.GetAxis("Horizontal");
//GetAxisRwo --- 直接获得 -1 0 1 这三个数字
float facedircetion = Input.GetAxisRaw("Horizontal");
//当正在移动时
if(horizontalmove != 0)
{
//获得速度的变化 ↓方向*速度 ↓使效果更平滑 ↓没有跳跃所以y轴没有变化
rb.velocity = new Vector2(horizontalmove * speed * Time.fixedDeltaTime, rb.velocity.y);
//实现idle和run动画效果切换 ↓-用数学函数[绝对值]保证永远>0
anim.SetFloat("running",Mathf.Abs(horizontalmove));
}
//判断角色面向方向
if(facedircetion !=0)
{
//获取transform下的scale ↓输入的方向 yz轴不变
transform.localScale = new Vector3(facedircetion,1,1);
}
//控制角色跳跃
// if(Input.GetButtonDown("Jump") && coll.IsTouchingLayers(ground))
// {
// rb.velocity = new Vector2(rb.velocity.x, jumpforce*Time.deltaTime);
// anim.SetBool("jumping",true);
// JumpAudio.Play();
// }
//优化跳跃手感
if(Input.GetButton("Jump") && coll.IsTouchingLayers(ground))
{
rb.velocity = new Vector2(rb.velocity.x, jumpforce * Time.deltaTime);
anim.SetBool("jumping", true);
JumpAudio.Play();
}
else if (!Input.GetButton("Jump") && coll.IsTouchingLayers(ground))
{
anim.SetBool("jumping", false);
}
Crouch();
}
void SwitchAnim()
{
//优化代码(因为idle为默认启动动画,所以idle不需判断)
// anim.SetBool("idle",false);
if(anim.GetBool("jumping"))//判断是否处于跳跃状态
{
if(rb.velocity.y<0)//判断跳跃的力是否小于0
{
anim.SetBool("jumping",false);
anim.SetBool("falling",true);
}
}
else if(isHurt)
{
//受伤效果
anim.SetBool("hurt",true);
anim.SetFloat("running",0);
//当player被击退后,将状态改回不受伤状态
if(Mathf.Abs(rb.velocity.x)<0.1f)
{
anim.SetBool("hurt",false);
// anim.SetBool("idle",true);
isHurt = false;
}
}
else if(coll.IsTouchingLayers(ground))//是否碰撞到ground层
{
anim.SetBool("falling",false);
// anim.SetBool("idle",true);
}
}
//碰撞触发器
private void OnTriggerEnter2D(Collider2D collision)
{
//通过标签碰撞检测
if(collision.tag == "Collection")
{
//播放收集音效
CollectionAudio.Play();
//摧毁游戏物体
Destroy(collision.gameObject);
Cherry++;
//UI显示Cherry的变化数值 用ToString方法进行类型转换
CherryNum.text = Cherry.ToString();
}
//触碰死线重载场景
if(collision.tag == "DeathLine")
{
//将所有的音频中第一个音频禁用(背景音乐那个)
GetComponent().enabled = false;
//延迟调用
Invoke("Restart",2f);
}
}
//摧毁敌人
private void OnCollisionEnter2D(Collision2D collision)
{
//通过tag检测碰撞enemy
if(collision.gameObject.tag == "Enemy")
{
//检测是否处于下落状态
if(anim.GetBool("falling"))
{
//踩死青蛙
Destroy(collision.gameObject);
//播放声音
boom.Play();
//然后小跳
rb.velocity = new Vector2(rb.velocity.x, jumpforce*Time.deltaTime);
anim.SetBool("jumping",true);
//播放爆炸动画
transform.position = collision.gameObject.transform.position;
GameObject daeth = Instantiate(Death,transform.position,Quaternion.identity);
Destroy(daeth,0.5f);
}
//如果小狐狸在青蛙左边
else if(transform.position.x < collision.gameObject.transform.position.x)
{
//播放受伤音效
HurtAudio.Play();
//给一个向左的力
rb.velocity = new Vector2(-5,rb.velocity.y);
isHurt = true;
}
else if(transform.position.x > collision.gameObject.transform.position.x)
{
//播放受伤音效
HurtAudio.Play();
//给一个向右的力
rb.velocity = new Vector2(5,rb.velocity.y);
isHurt = true;
}
}
}
//蹲
void Crouch()
{
// //检测Player头上是否有碰撞物
// if(!Physics2D.OverlapCircle(CeilingCheck.position,0.2f,ground))
// {
// if(Input.GetButton("Crouch"))
// {
// anim.SetBool("crouching",true);
// //discoll是否被启用
// DisColl.enabled = false;
// }
// else if(Input.GetButtonUp("Crouch"))
// {
// anim.SetBool("crouching",false);
// //松开按键时恢复头部的boxCollider
// DisColl.enabled = true;
// }
// }
//评论区大佬优化代码,使其更加流畅
if(!Physics2D.OverlapCircle(CeilingCheck.position,0.2f,ground))
{
if (Input.GetButton("Crouch"))
{
anim.SetBool("crouching", true);
DisColl.enabled = false;
}
else if (!Input.GetButton("Crouch"))
{
anim.SetBool("crouching", false);
DisColl.enabled = true;
}
}
}
//重载方法
void Restart()
{
//通过获取当前活动场景的名字进行载入
SceneManager.LoadScene(SceneManager.GetActiveScene().name);
}
}
通过某特定方式载入下一个场景
public class EnterDoor : MonoBehaviour
{
public GameObject enterDialog;
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "Player")
{
enterDialog.SetActive(true);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
enterDialog.SetActive(false);
}
}
public class EnterHouse : MonoBehaviour
{
private void Update()
{
if(Input.GetKeyDown(KeyCode.E))
{
// 得到当前场景的编号+1 得到下一个场景
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1);
}
}
}
镜头跟随
public class CameraContorl : MonoBehaviour
{
public Transform Player;
void Update()
{
//获取player坐标并使镜头坐标与其相等
transform.position = new Vector3(Player.position.x,0,-10f);
}
}
最后是关于菜单的
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Audio;
public class Menu : MonoBehaviour
{
public GameObject pasueMenu;
public AudioMixer audioMixer;
public void PlayGame()
{
//点击play载入场景
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1);
}
public void QuitGame()
{
Application.Quit();
}
//暂停按钮
public void PauseGame()
{
pasueMenu.SetActive(true);
//通过时间比例达到游戏暂停的效果
Time.timeScale = 0f;
}
//播放按钮
public void ResumeGame()
{
pasueMenu.SetActive(false);
Time.timeScale = 1f;
}
//调整游戏的声音
public void SetSound(float value)
{
audioMixer.SetFloat("MainSound",value);
}
}
public class EnterDoor : MonoBehaviour
{
public GameObject enterDialog;
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "Player")
{
enterDialog.SetActive(true);
}
}
private void OnTriggerExit2D(Collider2D collision)
{
enterDialog.SetActive(false);
}
}
public class EnterHouse : MonoBehaviour
{
private void Update()
{
if(Input.GetKeyDown(KeyCode.E))
{
// 得到当前场景的编号+1 得到下一个场景
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1);
}
}
}
镜头跟随
public class CameraContorl : MonoBehaviour
{
public Transform Player;
void Update()
{
//获取player坐标并使镜头坐标与其相等
transform.position = new Vector3(Player.position.x,0,-10f);
}
}
最后是关于菜单的
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Audio;
public class Menu : MonoBehaviour
{
public GameObject pasueMenu;
public AudioMixer audioMixer;
public void PlayGame()
{
//点击play载入场景
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1);
}
public void QuitGame()
{
Application.Quit();
}
//暂停按钮
public void PauseGame()
{
pasueMenu.SetActive(true);
//通过时间比例达到游戏暂停的效果
Time.timeScale = 0f;
}
//播放按钮
public void ResumeGame()
{
pasueMenu.SetActive(false);
Time.timeScale = 1f;
}
//调整游戏的声音
public void SetSound(float value)
{
audioMixer.SetFloat("MainSound",value);
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Audio;
public class Menu : MonoBehaviour
{
public GameObject pasueMenu;
public AudioMixer audioMixer;
public void PlayGame()
{
//点击play载入场景
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex+1);
}
public void QuitGame()
{
Application.Quit();
}
//暂停按钮
public void PauseGame()
{
pasueMenu.SetActive(true);
//通过时间比例达到游戏暂停的效果
Time.timeScale = 0f;
}
//播放按钮
public void ResumeGame()
{
pasueMenu.SetActive(false);
Time.timeScale = 1f;
}
//调整游戏的声音
public void SetSound(float value)
{
audioMixer.SetFloat("MainSound",value);
}
}
最后
虽然我游戏做的很简陋,也不是很有趣,但这种做出来的成功感还是让我觉得十分值得
制作的过程中学到了很多很多的知识,这里也是非常的感谢麦扣老师
附上我的游戏链接,有兴趣的小伙伴可以来试试呀
Viciya.rar_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1CTBbEOHiUnsYTgPLxUafPA提取码:0000 (四个零哦~)



