using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.InputSystem; using Sirenix.OdinInspector; using DG.Tweening; public class Player : PlayerControl { /// /// 玩家刚体组件喵 /// Rigidbody2D m_rigidbody; [Header("骨骼")] [FoldoutGroup("子物体")] public GameObject bone; Animator boneAnim; /// /// 脚底位置子物体 /// [Header("脚底位置")] [FoldoutGroup("子物体")] public Transform groundCheck; /// /// 手持武器 /// [Header("手持武器")] [FoldoutGroup("子物体")] public Item weapon; /// /// 武器生成位置(需要绑在骨骼上) /// [Header("武器生成位置(需要绑在骨骼上)")] [FoldoutGroup("子物体")] public Transform weaponTrans; [Header("武器生成位置偏移")] [FoldoutGroup("子物体")] public Vector3 weaponPos; /// /// 角色朝向(向右为1) /// [ReadOnly] [Header("朝向监测")] public int isRight = 1; /// /// 角色是否落地 /// [ReadOnly] [Header("落地监测")] public bool isGround = false; [Header("行走速度")][FoldoutGroup("角色操作数据")] public float speed; [Header("跳跃力量")][FoldoutGroup("角色操作数据")] public float jumpForce; /// /// 角色翻面时长 /// [Header("角色翻面所需时长")] public float flipDuration = 0.1f; //布尔------------------------- bool forceFlip = false; bool isHurting = false; /// /// 玩家初始化喵 /// override protected void Start() { base.Start(); m_rigidbody = gameObject.GetComponent(); boneAnim = bone.gameObject.GetComponent(); WeaponInit(); } //UPDATE void Update() { //OnInputDetect(); Flip(); /* if (inputDir!=0 && boneAnim.GetBool("Move")==false) boneAnim.SetBool("Move", true); */ } void FixedUpdate() { Moving(); } /// /// 翻面函数 /// void Flip() { int lastFrameDir = isRight; if (inputDir * lastFrameDir < 0 || forceFlip == true) { isRight *= -1; //transform.localScale = new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z); //transform.DOScale(new Vector3(-transform.localScale.x, transform.localScale.y, transform.localScale.z),0.1f); //分情况定值翻转 可以规避在旋转动画未结束时再次翻转的造成的起始角度不同从而影响目标角度误差的问题 switch (isRight) { case 1: transform.DORotate(new Vector3(0, 0, 0), flipDuration); break; case -1: transform.DORotate(new Vector3(0,180,0), flipDuration); break; } } } /* /// /// 检测是否停止摇杆输入 /// void OnInputDetect() { if (inputDir == 0&&isHurting==false) Freeze(); }*/ /// /// 强制静止 /// void Freeze() { m_rigidbody.velocity = new Vector2(0,m_rigidbody.velocity.y); } void Moving() { if (isHurting == false) { switch (inputDir) { case 0: boneAnim.SetBool("Move",false); break; default: boneAnim.SetBool("Move",true); break; } m_rigidbody.velocity = new Vector2(inputDir * speed, m_rigidbody.velocity.y); } } /// override protected void OnMove(InputAction.CallbackContext ctx) { base.OnMove(ctx); } override protected void OnAtk() { base.OnAtk(); } override protected void OnJump() { base.OnJump(); if (isGround == true) { isGround = false; m_rigidbody.velocity = new Vector2(m_rigidbody.velocity.x, jumpForce); } } override protected void OnInteract() { base.OnInteract(); } protected override void OnLeftChange() { ItemController.Instance.LeftChangeItem(); } protected override void OnRightChange() { //WeaponReturn(); ItemController.Instance.RightChangeItem(); //WeaponInPosition(); } //武器更换相关函数-------------------------------------------------- public void WeaponInPosition() { GameObject chosenOne; chosenOne = GameObject.Find(weapon.name); if (chosenOne.TryGetComponent(out Item chosenWeapen)) chosenWeapen.InPosition(weaponTrans,weaponPos); } public void WeaponReturn() { GameObject chosenOne; chosenOne = GameObject.Find(weapon.name); if (chosenOne.TryGetComponent(out Item chosenWeapon)) { //Debug.Log(chosenOne.name + chosenWeapon.GetOriposition()); chosenWeapon.ReturnToOri(); } } //武器生成--------------------------------------------------------- void WeaponInit() { WeaponInPosition(); } //受到攻击 public void GetHurt(int count,float time,float hitter_x) { isHurting = true; StopInput(time); //播动画 HurtInteractAnim(); if ((hitter_x - transform.position.x)*isRight< 0) { forceFlip = true; Flip(); forceFlip = false; } m_rigidbody.velocity = new Vector2(-isRight * 3, 3); } public void StopInput(float time) { ToMap("Null"); Invoke(nameof(ResetInput), time); } void ResetInput() { ToMap("Normal"); isHurting = false; } //跳跃判定(有点怪 后面可能会改) private void OnCollisionEnter2D(Collision2D collision)//当有物体碰上 { //创到地面时触发一次 if (collision.transform.CompareTag("Ground")) { //向脚底发射一条短射线 Ray2D ray = new Ray2D( groundCheck.position, Vector2.down ); Debug.DrawRay(ray.origin, ray.direction, Color.red, 10f); //获取射线的碰撞结果 RaycastHit2D hit2D; hit2D = Physics2D.Raycast(ray.origin, ray.direction, 0.001f); //如果射线有结果并且射线创到的是地面,才表示着地了 if (hit2D && hit2D.collider.transform.CompareTag("Ground")) { isGround = true; } else Debug.Log("Not Ground"); } } //-----------------------------------动画控制----------------------------------- public void TreeInteractAnim() { boneAnim.SetTrigger("与树交互"); } public void FireInteractAnim() { boneAnim.SetTrigger("与火交互"); } public void HurtInteractAnim() { boneAnim.SetTrigger("受伤"); } public void StoneInteractAnim() { boneAnim.SetTrigger("与火交互"); } }