religion/Assets/Scripts/小怪/NormalEnemy.cs
Roman fcc2089ae4 任务:替换美术素材、填充剧情
1.替换和实装美术素材
(1.制作基督小怪闪电动画
(2.替换镰刀CD贴图
(3.重做贵族动画
(4.添加交互按键提示,包含catching物体时浮现Y键,以及被缠抱时浮现摇杆转动动画
(5.实装特洛伊木马的召唤炸弹攻击的动画
(6.实装玩家鬼魂动画

2.填充剧情
*.新的演出继承自进入式触发器,OnCall内编写演出内容
*.村的开幕演出中额外补上:根据当前玩家进度开关事件碰撞体的功能
制作演出:
(1.贵族之怒演出编写完毕
(2.农民之叹演出编写完毕
(3.爱欲之附演出编写完毕
(4.安拉之拉演出编写完毕
(5.以撒之童演出编写完毕
(6.那位大人演出编写完毕
*.修改村开幕演出逻辑,使开幕演出时根据进度显示和隐藏剧情的触发器
(7.修改地藏开场演出,让其开场先执行一次敲钟攻击,很帅
(8.修改伊斯兰前置关演出,加上神之对话
(9.修改以撒开幕演出,增加一小段展示段

*优化和修复
1.修复以撒大闪电多次判定的问题
2.修复只有佛教前置关有死亡记录显示的bug

*.修复运行测试发现问题:
1.佛教前置关开幕演出走出太多
2.佛教前置关开幕演出角色名字没有替换
3.佛教前置关遮挡关系异常
4.伊斯兰前置关开幕演出走出太多
5.伊斯兰前置关忘记安排小怪
6.伊斯兰前置关隔间演出触发器不够高
7.基督前置关对话UI人物太大
8.读取留言板UI存在问题,需要在每个场景分别解决
9.伊斯兰前置关转移块颜色未改透明
10.增加以撒生命值
11.最终对话错别字

*.至此,游戏除了音乐音效部分基本完成,还差一些美术素材
*.进入最后阶段,调试和看修改结果时,务必调用当前场景的OnCall,否则可能触发深不可测的Bug

*建议
1.给基督小怪的闪电添加shader
2.目前炸弹爆炸没有效果

下班
2021-12-28 00:35:00 +08:00

212 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using Sirenix.OdinInspector;
/// <summary>
/// 普通怪物类,三关都有的那个
/// </summary>
public class NormalEnemy : Enemy
{
// _____ _ _ _
// | __ \ | | | (_)
// | |__) | _| |__ | |_ ___
// | ___/ | | | '_ \| | |/ __|
// | | | |_| | |_) | | | (__
// |_| \__,_|_.__/|_|_|\___|
[Header("被攻击后击飞的力度调整值")][FoldoutGroup("其他",false,0)]
public Vector2 hitToflyParameter;
[FoldoutGroup("其他",false,0)][Header("怪物死后旋转速度的随机区间")]
public float deadRotationRangeMax;
[FoldoutGroup("其他",false,0)]
public float deadRotationRangeMin;
/// <summary>
/// 这个小怪需要移动吗?
/// </summary>
[FoldoutGroup("其他",false,0)][Header("这个小怪需要移动吗?")]
public bool needWalk;
/// <summary>
/// 记录自己是不是在佛教前置关卡的演出中
/// </summary>
public bool isInFoStage = false;
// _____ _ _
// | __ \ (_) | |
// | |__) | __ ___ ____ _| |_ ___
// | ___/ '__| \ \ / / _` | __/ _ \
// | | | | | |\ V / (_| | || __/
// |_| |_| |_| \_/ \__,_|\__\___|
protected Rigidbody2D m_rigidbody;
/// <summary>
/// 死的时候的受击朝向
/// </summary>
protected int deadDir;
/// <summary>
/// 记录一下游戏开始时怪物的位置,方便被击飞后怪物重新回到巡逻起点
/// </summary>
protected Vector3 sourcePosition;
protected DOTweenPath doTweenPath;
[SerializeField][ReadOnly][FoldoutGroup("状态")]
protected bool inPath = true;
/// <summary>
/// 现在正在执行的动画,在受击中断的时候用
/// </summary>
protected Tween tweenNow;
private Animator animator;
//记录自己是否是特殊的,特殊的用在剧情里,不按正常的来
public bool isThisSpecial;
// _____ _ _ ____ _
// / ____| | | | _ \ | |
// | | __ _| | | |_) | __ _ ___| | __
// | | / _` | | | _ < / _` |/ __| |/ /
// | |___| (_| | | | |_) | (_| | (__| <
// \_____\__,_|_|_|____/ \__,_|\___|_|\_\
void Start(){Init();}
void Update(){
if(isInFoStage && state != State.dead && !isThisSpecial){
Seek();
}
}
// _ _ _
// | \ | | | |
// | \| | ___ _ __ _ __ ___ __ _| |
// | . ` |/ _ \| '__| '_ ` _ \ / _` | |
// | |\ | (_) | | | | | | | | (_| | |
// |_| \_|\___/|_| |_| |_| |_|\__,_|_|
private void Seek(){
Transform target = FindObjectOfType<MyPlayer>().transform;
Vector3 moveDir = (target.transform.position - transform.position).normalized;
// //给刚体添加位移
// m_rigidbody.position += (Vector2)moveDir * speed * Time.deltaTime * Vector2.right;
//给刚体以速度
if(canBeHit)
m_rigidbody.velocity = new Vector2(
((moveDir.x > 0) ? 1 : -1) * speed,
m_rigidbody.velocity.y
);
//将面部朝向与速度同步
transform.rotation = Quaternion.
Euler
(transform.rotation.x,
((target.position.x - transform.position.x > 0) ? 0:-180),
transform.rotation.z);
}
protected virtual void Init(){
//生命值初始化为满
HPLeft = HP;
//Get插件
doTweenPath = GetComponent<DOTweenPath>();
m_rigidbody = GetComponent<Rigidbody2D>();
sourcePosition = transform.position;
animator = GetComponent<Animator>();
//初始话目前播放的Tween动画为巡逻
tweenNow = doTweenPath.tween;
//如果是需要走路的类型,则播放状态至走路状体
if(needWalk) animator.SetBool("isWalk",true);
}
/// <summary>
/// 协程用,删除自己这个游戏物体
/// </summary>
protected void Dead(){Destroy(gameObject);}
/// <summary>
/// 被击飞的击飞效果处理
/// </summary>
/// <param name="dir">被击方向</param>
public void BeHitToFly(int dir){
try{
m_rigidbody.velocity += new Vector2( //给予自身一个
-1 * dir * hitToflyParameter.x,//X方向为力度系数乘以受击方向
hitToflyParameter.y//Y方向为力度系数
//的绝对的速度
);
}catch(System.Exception)
{
Debug.Log("请检查这个小怪是否是可被攻击那种如果不是请给他添加刚体并检查try代码");
}
}
// ______ _
// | ____| | |
// | |____ _____ _ __ | |_
// | __\ \ / / _ \ '_ \| __|
// | |___\ V / __/ | | | |_
// |______\_/ \___|_| |_|\__|
protected override void OnTouchThePlayer(MyPlayer player){
//告诉玩家,你被攻击了
player.OnBeHit(ATK,
((transform.position.x -
player.transform.position.x)
> 0) ? 1 : -1);//通过自身位置和玩家位置的比较来返回玩家本次的受击方向
}
public override void OnBeHit(MyPlayer.AtkMethod hitMethod, int hitDir){
//结束当前动画
tweenNow.Pause();
//让自己被击飞
BeHitToFly(hitDir);
//修改标志表示自己当前不在Path中
inPath = false;
//结算生命值
HPLeft -= MyPlayer.atkMethodMagnification[hitMethod];
//看下死了没
//死了就记录下死亡时候的面部朝向用来做死亡翻滚效果然后再Call一下死亡事件
if(CheckDead()) {deadDir = hitDir;OnDead();}
//被打飞了在着地前都不会挨打了
canBeHit = false;
//播放受击动画 // 解决Bug用不要删除后一个条件
if(animator != null && HPLeft < 10)animator.SetBool("isBeHit",true);
}
public override void OnRetouchedTheGround(){
if(!inPath){//如果此时怪物没在巡逻且着地了,说明时被击飞然后着地了
//新建一个动画,让怪物回到初始记录位置
Tween tween = transform.DOMove(sourcePosition,
Mathf.Abs(sourcePosition.x - transform.position.x) / speed,
false);
//设置该动画插值方式为线性
tween.SetEase(Ease.Linear);
//更改记录的此时正在执行的动画
tweenNow = tween;
//写一个委托,插入这个新动画的结束事件
TweenCallback myCallBack = () =>
//结束说明回到了初始点,此时让怪物重新开始巡逻,同时更改记录中的正在执行的动画为巡逻
{doTweenPath.DORestart(); tweenNow = doTweenPath.tween;};
//插入写的委托
tween.OnComplete(myCallBack);
//标记自身重新回到巡逻动画
inPath = true;
//矫正一下faceDir的问题
transform.rotation = Quaternion.
Euler
(transform.rotation.x,
((sourcePosition.x - transform.position.x > 0) ? 0:-180),
transform.rotation.z);
}
canBeHit = true;
//停止受击动画
animator.SetBool("isBeHit",false);
}
public override void OnDead()
{
//
m_rigidbody.constraints = RigidbodyConstraints2D.None;
//标记当前状态为死亡
state = State.dead;
//加一个扭矩,营造死亡的效果
m_rigidbody.AddTorque(Random.Range(deadRotationRangeMin,deadRotationRangeMax) * deadDir);
//关掉自己的碰撞体
GetComponent<BoxCollider2D>().enabled = false;
//两秒后自己毁灭
Invoke("Dead",2f);
}
}