任务:搭建基本的系统

1.完成玩家被爱欲品抓住的逻辑
(1.在玩家类已经留下空事件,需要完成逻辑:当被爱欲品抓住,玩家需要:
((1.声明bool新变量isCatching
((2.更改变量isCatching为true
((3.更改inControl变量为false,此时玩家不再能移动
((4.处理伤害,每秒减去爱欲品的atk的血量
(2.在InputSystem的事件OnMove中,触发转身处,添加一处判定,若此时inControl,才能进行转身操作。若isCatching为真,不触发转身,进而触发爱欲品的挣脱事件。
(*:修改爱欲品完全挣脱事件,使其通知玩家已经完全挣脱
(3.当收到完全挣脱的消息,恢复isCatching为false,同时恢复inControl,同时关闭掉血协程,同时删除记录的抓着玩家的爱欲品

*:至此,爱欲品的行动逻辑基本上开发完成

2.修复玩家用锤子攻击会多次判定到怪物身上的Bug
3.修复玩家挥锤子卡手的问题
4.重新匹配锤子挥动判定与动画
5.修改锤子动画速度曲线
6.解决狂按攻击有概率卡死的问题
7.使玩家攻击的时候无法移动
8.解决玩家被缠抱时可以跳跃的问题
9.解决玩家被缠抱时可以发镰刀的问题

攻击手感很怪,还需要细调
🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔🤔
This commit is contained in:
Roman 2021-12-03 23:58:34 +08:00
parent 5b2e3633ab
commit 032bef564e
8 changed files with 111 additions and 43 deletions

View File

@ -363,14 +363,14 @@ Transform:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 321454205}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalRotation: {x: 0, y: 0, z: -1, w: 0}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_Children:
- {fileID: 2098309883}
m_Father: {fileID: 326335323}
m_RootOrder: 0
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: -180}
--- !u!114 &321454207
MonoBehaviour:
m_ObjectHideFlags: 0
@ -429,7 +429,7 @@ MonoBehaviour:
targetGO: {fileID: 0}
tweenTargetIsTargetGO: 1
delay: 0
duration: 0.5
duration: 0.25
easeType: 1
easeCurve:
serializedVersion: 2
@ -472,7 +472,7 @@ MonoBehaviour:
autoPlay: 0
useTargetAsV3: 0
endValueFloat: 0
endValueV3: {x: 0, y: 0, z: -90}
endValueV3: {x: 0, y: 0, z: -1}
endValueV2: {x: 0, y: 0}
endValueColor: {r: 1, g: 1, b: 1, a: 1}
endValueString:
@ -747,6 +747,7 @@ MonoBehaviour:
sickleCDLeft: 0
inControl: 1
HPLeft: 0
isCatching: 0
--- !u!95 &326335328
Animator:
serializedVersion: 3
@ -1219,6 +1220,7 @@ MonoBehaviour:
ATK: 1
speed: 1
coin: 0
canBeHit: 1
HPLeft: 0
state: 0
hitToflyParameter: {x: 3, y: 3}
@ -1226,7 +1228,7 @@ MonoBehaviour:
deadRotationRangeMin: 500
inPath: 1
catchOffset: {x: 0, y: 0, z: 0}
breakFreeCount: 1
breakFreeCount: 5
breakFreeCountLeft: 0
--- !u!1 &839378814
GameObject:
@ -1840,6 +1842,7 @@ MonoBehaviour:
ATK: 1
speed: 1
coin: 0
canBeHit: 1
HPLeft: 0
state: 0
hitToflyParameter: {x: 3, y: 3}
@ -2048,7 +2051,7 @@ Transform:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2098309882}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 1.306, z: 0}
m_LocalPosition: {x: 0, y: 0.44, z: 0}
m_LocalScale: {x: 0.1875, y: 1.2, z: 1}
m_Children: []
m_Father: {fileID: 321454206}
@ -2093,9 +2096,9 @@ SpriteRenderer:
m_LightmapParameters: {fileID: 0}
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_SortingOrder: 1
m_Sprite: {fileID: 7482667652216324306, guid: 48e93eef0688c4a259cb0eddcd8661f7, type: 3}
m_Color: {r: 1, g: 1, b: 1, a: 0}
m_Color: {r: 1, g: 1, b: 1, a: 1}
m_FlipX: 0
m_FlipY: 0
m_DrawMode: 0
@ -2112,7 +2115,7 @@ BoxCollider2D:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2098309882}
m_Enabled: 0
m_Enabled: 1
m_Density: 1
m_Material: {fileID: 0}
m_IsTrigger: 1

View File

@ -99,7 +99,7 @@ public class AiYuPin : NormalEnemy
/// </summary>
protected override void OnFindThePlayer(Transform target){
//如果没死
if(state != State.dead)
if(state == State.wander)
{
//标记自身状态
state = State.seek;
@ -115,6 +115,10 @@ public class AiYuPin : NormalEnemy
/// </summary>
protected override void OnTouchThePlayer(MyPlayer player)
{
//通知玩家,你被爱欲品附身了
player.BeCatchedByAiYuPin(this);
//暂停Path动画
doTweenPath.DOPause();
//改变自身状态为ATK
state = State.atk;
//关闭自身碰撞体,因为要贴在玩家身上
@ -122,10 +126,10 @@ public class AiYuPin : NormalEnemy
//将自身位置和玩家位置同步但是需要一个附身offset二维向量
//因为玩家的图片不在游戏物体的中心
transform.position = target.position + catchOffset;
//通知玩家,你被爱欲品附身了
player.BeCatchedByAiYuPin(this);
//暂时清空重力系数
m_rigidbody.gravityScale = 0;
//清除一下刚体速度,不然怪物可能被创飞
m_rigidbody.velocity = Vector2.zero;
}
/// <summary>
@ -139,10 +143,12 @@ public class AiYuPin : NormalEnemy
OnFindThePlayer(target);//触发发现玩家事件
//执行被击飞、死亡检查等事宜
base.OnBeHit(hitMethod, hitDir);
//被打飞在着地前都不会挨打了
canBeHit = false;
}
//原先会触发自动返回记录起点,但是不能,所以重写空的重新着地事件
protected override void OnRetouchedTheGround(){}
protected override void OnRetouchedTheGround(){ canBeHit = true; }
/// <summary>
/// 完全挣脱的时候触发
@ -156,13 +162,14 @@ public class AiYuPin : NormalEnemy
OnDead();
//给一个击飞
BeHitToFly((Random.Range(-1f,1f) > 0) ? 1: -1);
//通知玩家
FindObjectOfType<MyPlayer>().BreakFreeCompletely();
}
/// <summary>
/// 玩家尝试挣脱的时候触发这个
/// </summary>
[ContextMenu("挣脱")]
protected void OnBreakFree(){
public void OnBreakFree(){
if(--breakFreeCountLeft <= 0) OnBreakFreeCompletely();
}

View File

@ -43,6 +43,10 @@ public class Enemy : MonoBehaviour
/// 怪物拥有的几种状态
/// </summary>
public enum State{wander,seek,atk,dead};
/// <summary>
/// 此时怪物能否被攻击
/// </summary>
public bool canBeHit = true;
// _____ _ _
// | __ \ (_) | |

View File

@ -9,10 +9,10 @@ public class Hammer : MonoBehaviour
{
//当有东西进入触发器
public void OnTriggerEnter2D(Collider2D other){
//看看是不是敌人
if(other.TryGetComponent<Enemy>(out Enemy enemy)){
enemy.OnBeHit(MyPlayer.AtkMethod.,
(enemy.transform.position.x -
//看看是不是敌人,再看下它此时能不能被打
if (other.TryGetComponent<Enemy>(out Enemy enemy) && enemy.canBeHit && !other.isTrigger){
enemy.OnBeHit(MyPlayer.AtkMethod.,
(enemy.transform.position.x -
transform.position.x > 0) ? -1 : 1);
}
}

View File

@ -96,6 +96,15 @@ public class MyPlayer : MonoBehaviour
/// 是否在攻击
/// </summary>
private bool isAttacking;
/// <summary>
/// 记录此时自己是否被爱欲品缠抱
/// </summary>
[Header("被缠抱了吗?")][SerializeField][ReadOnly][FoldoutGroup("Info")]
private bool isCatching = false;
/// <summary>
/// 正抓着玩家的爱欲品
/// </summary>
private AiYuPin catingAiYuPin;
// _____ _ _ ____ _
@ -112,12 +121,12 @@ public class MyPlayer : MonoBehaviour
void Update()
{
CountCD();
ChangeAnimator();
}
void FixedUpdate()
{
Move();//处理水平移动
ChangeAnimator();
Move();//处理水平移动
}
// _ _ _
@ -153,7 +162,7 @@ public class MyPlayer : MonoBehaviour
//移动函数,处理水平方向移动
private void Move()
{
if(inControl){
if(inControl && !isAttacking){
//直接修改刚体速度
m_rigidbody.velocity = new Vector2(inputDir * speed,//水平方向以输入方向乘以预设速度大小
m_rigidbody.velocity.y);//垂直方向不变
@ -191,7 +200,7 @@ public class MyPlayer : MonoBehaviour
}
/// <summary>
/// 每FixedUpdate调用处理状态机全部放这里
/// 每Update调用处理状态机全部放这里
/// </summary>
protected void ChangeAnimator()
{
@ -213,6 +222,13 @@ public class MyPlayer : MonoBehaviour
//被击飞动画触发
m_Animator.SetBool("isBeHitting",!inControl);
}
/// <summary>
/// 被爱欲品抓住时用协程触发
/// </summary>
private void CatchingHarm(){
HPLeft -= FindObjectOfType<AiYuPin>().ATK;
}
//碰撞检测代码
// _____ _ _ _ _
// / ____| | | (_) (_)
@ -224,7 +240,7 @@ public class MyPlayer : MonoBehaviour
{
if(collision.transform.tag == "地面")
{isLanding = true;//若碰撞物体标签为地面,标记自身着地
inControl = true;}
if(!isCatching)inControl = true;}
}
private void OnCollisionExit2D(Collision2D collision)//当有碰撞体离开
{
@ -249,7 +265,8 @@ public class MyPlayer : MonoBehaviour
else inputDir = 0;
if(faceDir * inputDir < 0){
TurnAround();
if(inControl)TurnAround();
if(isCatching){catingAiYuPin.OnBreakFree();}
}
}
@ -258,7 +275,7 @@ public class MyPlayer : MonoBehaviour
//当按下跳跃键
if(context.performed)
{
if(isLanding){//如果当前着地
if(isLanding && inControl){//如果当前着地
//给予自身刚体
m_rigidbody.velocity = new Vector2(m_rigidbody.velocity.x,//水平方向速度不变
jumpForce);//垂直方向给予预设跳跃速度
@ -277,13 +294,13 @@ public class MyPlayer : MonoBehaviour
hammerCollider.enabled = true;//打开锤子碰撞体
wavingAnimation.DOPlay();//播放挥动锤子动画
hammerCDLeft = hammerCD;//挥动成功重置CD剩余时间
isAttacking = true;
if(!isAttacking)isAttacking = true;
}
}
public void OnSickle(InputAction.CallbackContext context)
{
if(context.started && sickleCDLeft <= 0)
if(context.started && sickleCDLeft <= 0 && inControl)
{
Sickle sickle = Instantiate(
sicklePrefab,
@ -320,8 +337,11 @@ public class MyPlayer : MonoBehaviour
/// <param name="dir">攻击来源的方向,-1左1右</param>
public void OnBeHit(float atk, int dir)
{
//触发一个击飞
BeHitToFly(dir);
//标记自身不受控制
inControl = false;
//掉血
HPLeft -= atk;
}
@ -335,7 +355,32 @@ public class MyPlayer : MonoBehaviour
/// </summary>
/// <param name="aiYuPin">这个爱欲品的爱欲品组件</param>
public void BeCatchedByAiYuPin(AiYuPin aiYuPin){
//标记自身正被抓着
isCatching = true;
//标记自身失去控制
inControl = false;
//每秒掉血,伤害量为爱欲品的攻击力
InvokeRepeating("CatchingHarm",0f,1f);
//去除刚体速度,防止滑行带来的位置偏移问题
m_rigidbody.velocity = Vector2.zero;
//记录正在抓着自己的爱欲品
catingAiYuPin = aiYuPin;
}
/// <summary>
/// 完全挣脱的时候从爱欲品Call过来
/// </summary>
public void BreakFreeCompletely(){
//取消被抓住的标记
isCatching = false;
//恢复移动操控
inControl = true;
//取消掉血协程
CancelInvoke("CatchingHarm");
//去掉记录着的抓住玩家的爱欲品
catingAiYuPin = null;
//消除正在攻击状态以解决Bug
isAttacking = false;
}

View File

@ -115,6 +115,8 @@ public class NormalEnemy : Enemy
//看下死了没
//死了就记录下死亡时候的面部朝向用来做死亡翻滚效果然后再Call一下死亡事件
if(CheckDead()) {deadDir = hitDir;OnDead();}
//被打飞了在着地前都不会挨打了
canBeHit = false;
}
protected override void OnRetouchedTheGround(){
@ -142,6 +144,7 @@ public class NormalEnemy : Enemy
((sourcePosition.x - transform.position.x > 0) ? 0:-180),
transform.rotation.z);
}
canBeHit = true;
}
protected override void OnDead()

View File

@ -136,7 +136,10 @@ AnimatorStateTransition:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name:
m_Conditions: []
m_Conditions:
- m_ConditionMode: 2
m_ConditionEvent: isAttacking
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: -1583730504211193444}
m_Solo: 0
@ -146,7 +149,7 @@ AnimatorStateTransition:
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0.75
m_HasExitTime: 1
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0
m_OrderedInterruption: 1
@ -220,37 +223,37 @@ AnimatorController:
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: isJumping
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: isFalling
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: isLanding
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: isAttacking
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
- m_Name: isBeHitting
m_Type: 4
m_DefaultFloat: 0
m_DefaultInt: 0
m_DefaultBool: 0
m_Controller: {fileID: 0}
m_Controller: {fileID: 9100000}
m_AnimatorLayers:
- serializedVersion: 5
m_Name: Base Layer
@ -469,15 +472,18 @@ AnimatorStateTransition:
- m_ConditionMode: 1
m_ConditionEvent: isAttacking
m_EventTreshold: 0
- m_ConditionMode: 2
m_ConditionEvent: isBeHitting
m_EventTreshold: 0
m_DstStateMachine: {fileID: 0}
m_DstState: {fileID: 634860784232356001}
m_Solo: 0
m_Mute: 0
m_IsExit: 0
serializedVersion: 3
m_TransitionDuration: 0.25
m_TransitionDuration: 0
m_TransitionOffset: 0
m_ExitTime: 0.75
m_ExitTime: 0.75000006
m_HasExitTime: 0
m_HasFixedDuration: 1
m_InterruptionSource: 0

View File

@ -21,11 +21,11 @@ AnimationClip:
- curve:
- time: 0
value: {fileID: 21300000, guid: 50be5505d01b483409b02eac9d8ac8e5, type: 3}
- time: 0.083333336
- time: 0.06666667
value: {fileID: 21300000, guid: d15b91f7b544ae944b0975da4e3c8dc5, type: 3}
- time: 0.15
- time: 0.1
value: {fileID: 21300000, guid: 0803bd9b6a71cb74faa66ff1f629f77b, type: 3}
- time: 0.23333333
- time: 0.16666667
value: {fileID: 21300000, guid: 238b4b39856f258489d82506f0976575, type: 3}
attribute: m_Sprite
path:
@ -55,7 +55,7 @@ AnimationClip:
m_AdditiveReferencePoseClip: {fileID: 0}
m_AdditiveReferencePoseTime: 0
m_StartTime: 0
m_StopTime: 0.25
m_StopTime: 0.18333334
m_OrientationOffsetY: 0
m_Level: 0
m_CycleOffset: 0
@ -75,7 +75,7 @@ AnimationClip:
m_HasGenericRootTransform: 0
m_HasMotionFloatCurves: 0
m_Events:
- time: 0.23333333
- time: 0.18333334
functionName: StopAttacking
data:
objectReferenceParameter: {fileID: 11500000, guid: f563a3b3d1fe31d45bae72dd7ca265fd, type: 3}