栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > 其他

关于b站M

其他 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于b站M

玩家控制脚本(优化)
​
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);
    }
}

最后

虽然我游戏做的很简陋,也不是很有趣,但这种做出来的成功感还是让我觉得十分值得

制作的过程中学到了很多很多的知识,这里也是非常的感谢麦扣老师

附上我的游戏链接,有兴趣的小伙伴可以来试试呀

Viciya.rar_免费高速下载|百度网盘-分享无限制百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间https://pan.baidu.com/s/1CTBbEOHiUnsYTgPLxUafPA提取码:0000  (四个零哦~)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/902061.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号