当前位置: 首页 > news >正文

学习游戏制作记录(史莱姆敌人的制作)

1.史莱姆的状态机

我们需要创建与之前骷髅敌人类似的史莱姆,因此实现骷髅的脚本我们是可以照搬的

修改Enemy_Slime脚本:

public enum SlimeType { big,medium,small}//史莱姆的类型
[Header("Slime Spesific")]
[SerializeField] private SlimeType slimeType;
[SerializeField] private int slimesToCreate;//分裂的数量
[SerializeField] GameObject slimePrefab;//分裂的预制体
[SerializeField] Vector2 minCreateVelocity;//分裂的推力
[SerializeField] Vector2 maxCreateVelocity;

    public override void Die()
{
base.Die();

        enemyStateMachine.ChangeState(deadState);

        if (slimeType == SlimeType.small)//如果是最小的则不分裂
return;

        CreateSlime(slimesToCreate, slimePrefab);
}


    private void CreateSlime(int _SlimesToCreate,GameObject _slimePrefab)
{
for(int i=0;i<_SlimesToCreate;i++)
{
GameObject newSlime = Instantiate(_slimePrefab, transform.position, Quaternion.identity);//循环创建分裂体

            newSlime.GetComponent<Enemy_Slime>().SetupSlime(facingDir);
}
}

    public void SetupSlime(int _facingDir)
{
if (_facingDir != facingDir)//设置朝向
Flip();

        float xVelocity=Random.Range(minCreateVelocity.x,maxCreateVelocity.x);
float yVelocity=Random.Range(minCreateVelocity.y,maxCreateVelocity.y);

        isKnockback = true;

        GetComponent<Rigidbody2D>().velocity = new Vector2(xVelocity * -facingDir, yVelocity);//执行推力

        Invoke("CancelKnockBack", 1.5f);
}

    private void CancelKnockBack()=>isKnockback = false;

2.实现史莱姆的击晕效果

SlimeStunnedState脚本:

    public override void Exit()
{
base.Exit();

        enemy.state.MakeInvicibale(false);//退出无敌
}

    public override void Update()
{
base.Update();

        if(rb.velocity.y<.1f&&enemy.isGroundDetected())//如果史莱姆落地
{
enemy.entityFX.Invoke("CancelColorChange", 0);//取消颜色变化
enemy.anim.SetTrigger("StunFold");//播放眩晕动画
enemy.state.MakeInvicibale(true);//被击晕保持一段时间的无敌

        }

        if (stateTimer < 0)
{
enemy.enemyStateMachine.ChangeState(enemy.idleState);
}
}

3.实现玩家击退怪物的差异

Entity脚本:


  [SerializeField] protected Vector2 KnockbackOffest;//击退偏差

    protected virtual IEnumerator HitKonockback()
{
isKnockback = true;

        float xoffest=Random.Range(KnockbackOffest.x, KnockbackOffest.y);//设置偏差

        //if(KnockbackPower.x>0||KnockbackPower.y>0)//这会使玩家的冻结效果失效
rb.velocity = new Vector2((KnockbackPower.x+xoffest) * knockbackDir,KnockbackPower.y);

        yield return new WaitForSeconds(KnockbackDuration);

        isKnockback = false;

        SetZeroKnockBackPower();
}

4.实现敌人在周围检测玩家的统一化处理

Enemy脚本:


public float agroDistance = 2;//仇恨范围

SlimeGrounedState脚本:

    public override void Update()
{
base.Update();
if (player == null)
{
player = PlayerManage.instance.player.transform;

        }

        if (enemy.isPlayerDetected() || Vector2.Distance(player.position, enemy.transform.position) < enemy.agroDistance)//仇恨距离内
{
enemy.enemyStateMachine.ChangeState(enemy.battleState);
}
}

http://www.dtcms.com/a/404095.html

相关文章:

  • 创建一个网站一般步骤有哪些网站开发python
  • 江苏省建设厅官网网站首页网站建设二次开发怎么样
  • 安徽网站建设公司哪家好上海域名icp海网站建设
  • 北京住房城乡建设部网站首页搭建论坛需要多少钱
  • 养老网站建设方案咨询类网站建设方案书
  • Java算法起航:数据结构与复杂度入门
  • 市北区开发建设局 网站老客户网站建设
  • 足球直播网站开发定制检察院网站建设
  • dw软件网站建设教程视频云阳网站建设公司
  • Ubuntu 20.04上安装Miniconda3(一)
  • 免费网站模板素材一般淘宝网站做几个月赚钱
  • 可以做设计兼职的网站有哪些工作狮城app更多网站
  • 区域提议(Region Proposal)
  • 交互性强的网站龙轩导航
  • 为什么网站关键词没有排名产品推广ppt范例
  • 前沿系统级编程:Zig 与 Rust 技术深度解析与实践
  • Spring Boot 中@RestController注解的详解和使用
  • 滨州论坛网站建设怎样做网站 知乎
  • Vue.js响应式API
  • 汕头网站建设培训公司手机开发者选项怎么关闭
  • 电子商务网站的建设目标织梦移动端网站模板下载
  • 2025.9.24总结
  • 基于 OpenCV 的 FisherFaceRecognizer 人脸识别与中文标签显示实践
  • 推荐个临汾做网站的如何自己创建购物网站
  • 做靓号网站网络黄页进入有限公司
  • 建设企业网站个人网银wordpress有多大的数据量
  • GD32E103CBT8-空闲中断DMA接收
  • 网站在正在建设中网站建设销售秘籍
  • 建设银行 网站设置密码网站开发前端的工作内容是什么
  • 接口幂等性与限流(二)