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 Transform groundCheck; /// /// 手持武器 /// [Header("手持武器")] [FoldoutGroup("子物体")] public Item weapon; /// /// 武器生成位置(需要绑在骨骼上) /// [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; /// /// 玩家初始化喵 /// override protected void Start() { base.Start(); m_rigidbody = gameObject.GetComponent(); WeaponInit(); } //UPDATE void Update() { OnInputDetect(); Flip(); } void FixedUpdate() { Moving(); } /// /// 翻面函数 /// void Flip() { int lastFrameDir = isRight; if (inputDir * lastFrameDir < 0) { 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) Freeze(); } /// /// 强制静止 /// void Freeze() { m_rigidbody.velocity = new Vector2(0,m_rigidbody.velocity.y); } void Moving() { 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(transform,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(); } 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"); } } }