
1.编写以撒逻辑 (1.继承于Enemy (2.编写OnSave(男童)事件,当有男童被解救,会触发以撒的这个事件,后续逻辑等待讨论 (3.具有冲撞和闪电两种攻击方式,通过类似地藏的方式轮回随机决定攻击方式 (4.编写冲撞攻击逻辑 ((*.创建鬼魂脚本 ((*.创建鬼魂预制体,需要内含触发器 ((1.当执行,以玩家为中心向周围一圈固定距离随机方向的某处召唤鬼魂,并记录下此时自身到玩家的方向 ((2.等待一小段时间,令鬼魂以记录方向冲撞出去,利用Tweener动画营造一种先抖一下然后猛地创过来的感觉 ((3.动画结束后,鬼魂逐渐消隐 ((4.消隐结束后,删除游戏物体 ((5.冲撞过程中具有攻击判定,若创到玩家,触发玩家的受击事件,同时获取主人的攻击力传给玩家 (3.编写闪电攻击逻辑 ((1.当执行,在玩家头顶一定距离处生成鬼魂 ((2.淡入显示鬼魂,一小段时间后,命令鬼魂发动落雷攻击 ((3.发动时,激活场景内的巨型落雷,同时更改落雷的x位置到鬼魂的x,子物体具有触发器,(每帧)检测到玩家在内则对玩家造成伤害 ((4.在极短的时间后关闭落雷同时开始淡出鬼魂 ((5.淡出结束后删除游戏物体 2.编写男童逻辑 (1.继承于Interactive (2.编写解救男童逻辑 ((*.修改Interactive基类,新增OnCallCancel事件,当交互键抬起时触发一次 ((*.新增男童状态的枚举类型,包含:wait、saving、OK三个状态 ((*:新增一个变量记录男童状态 ((1.重写OnCall事件,当OnCall,修改状态至saving ((2.Update回调中,若处于saving状态,则开始减少CDLeft,同时判断CDLeft是否耗尽,若耗尽,触发OnSave ((3.编写OnSave函数,修改状态至OK,通知owner自己已经OnSave ((4.重写OnCallCancel事件,当触发,判定状态,若处于saving状态,则修改状态至wait,恢复CDLeft ((*.使得玩家救人的时候无法移动,而当交互键抬起,重新获得移动能力 ((*.修改可交互基类,当玩家交互过程中丢失catching,触发可交互物体的中断,同时告知玩家交互中断,触发中断事件 ((5.解救结束后,通知玩家解救结束 至此,以撒的Boss逻辑还差首尾部分 加速吧
113 lines
3.4 KiB
C#
113 lines
3.4 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
using Cinemachine;
|
|
using Sirenix.OdinInspector;
|
|
using UnityEngine.InputSystem;
|
|
|
|
/// <summary>
|
|
/// 震动管理员,管理相机和手柄的震动,外部调用静态方法
|
|
/// </summary>
|
|
public class VibrationManager : MonoBehaviour
|
|
{
|
|
public enum PadShakeitem{
|
|
移动,
|
|
跳跃,
|
|
锤子击中,
|
|
被击中,
|
|
发射镰刀,
|
|
挥动锤子,
|
|
木马移动,
|
|
反弹炸弹,
|
|
撞钟攻击,
|
|
伸手拿钱
|
|
}
|
|
/// <summary>
|
|
/// 不会停下的震动的编号
|
|
/// </summary>
|
|
public List<PadShakeitem> doNotStopShakeNum;
|
|
|
|
/// <summary>
|
|
/// 还接待新的震动吗?
|
|
/// </summary>
|
|
private bool tradeable = true;
|
|
|
|
public PadShakeitem itemNow;
|
|
/// <summary>
|
|
/// 是否处于特洛伊Boss关
|
|
/// </summary>
|
|
public bool inHorseStage;
|
|
|
|
void Start(){
|
|
doNotStopShakeNum = new List<PadShakeitem>();
|
|
doNotStopShakeNum.Add(PadShakeitem.撞钟攻击);
|
|
doNotStopShakeNum.Add(PadShakeitem.伸手拿钱);
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 震动相机,仅对于一些微小短小震动使用
|
|
/// </summary>
|
|
/// <param name="dir">震动方向</param>
|
|
/// <param name="force">震动力度</param>
|
|
public void ShakeScream(Vector2 dir,float force){
|
|
GetComponent<CinemachineImpulseSource>().
|
|
GenerateImpulse(dir * force);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 震动手柄
|
|
/// </summary>
|
|
/// <param name="left">左马达力度(低频)</param>
|
|
/// <param name="right">右马达力度(高频)</param>
|
|
/// <param name="time">震动时间</param>
|
|
/// <param name="item">震动原因</param>
|
|
public IEnumerator ShakePad(float left, float right, float time, PadShakeitem item){
|
|
if(Gamepad.current != null){
|
|
|
|
//只有处于可接待状态时,才接待震动
|
|
if(tradeable){
|
|
//记录震动项目并开始震动
|
|
itemNow = item;
|
|
Gamepad.current.SetMotorSpeeds(left,right);
|
|
}
|
|
//如果该项目是不可被打断列表中记录着的
|
|
if(doNotStopShakeNum.Contains(item)){
|
|
//标记自身不再接待新的震动
|
|
tradeable = false;
|
|
}
|
|
//Debug.Log("正在开始"+item+"的震动");
|
|
yield return new WaitForSeconds(time);
|
|
//只有震动项目和震动原因相同的时候,才会触发停止震动
|
|
//用来解决震动的覆盖问题
|
|
if(itemNow == item){
|
|
//Debug.Log("正在结束"+item+"的震动");
|
|
Gamepad.current.SetMotorSpeeds(0,0);
|
|
if(inHorseStage)HorseShakePad();
|
|
tradeable = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 木马震动,屏幕轻微快速上下震动
|
|
/// </summary>
|
|
public void HorseShakeScream(){
|
|
transform.Find("木马震动源").
|
|
GetComponent<CinemachineImpulseSource>().
|
|
GenerateImpulse();
|
|
}
|
|
/// <summary>
|
|
/// 撞钟攻击调用,屏幕中幅度震动
|
|
/// </summary>
|
|
public void BellShakeScream(){
|
|
transform.Find("撞钟震动源").
|
|
GetComponent<CinemachineImpulseSource>().
|
|
GenerateImpulse();
|
|
}
|
|
|
|
public void HorseShakePad(){
|
|
StartCoroutine(ShakePad(0f,0.1f,20f,PadShakeitem.木马移动));
|
|
}
|
|
} |