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

学习游戏制作记录(改进投掷剑的行为)7.27

1.实现剑跟随飞行方向旋转

修改剑的预制体使剑的朝向对准右x轴

Sword_Skill_Contorl脚本:

    private void Update()
{
transform.right = rb.velocity;//时刻更新位置
}

2.实现剑插入地面或者敌人

修改预制体为触发器

Sword_Skill_Contorl脚本:

    private bool canRotate=true;

    private void Update()
{
if(canRotate)//可以旋转才能设置速度
{
transform.right = rb.velocity;

        }

       
}

    private void OnTriggerEnter2D(Collider2D collision)
{
canRotate = false;//不能旋转
cd.enabled = false;//关闭碰撞器

        rb.isKinematic = true;//设置为Kinematic,这是一个运动学状态
rb.constraints = RigidbodyConstraints2D.FreezeAll;//锁定xyz

        transform.parent = collision.transform;//将剑设置为碰撞到物体的子对象
}

演示:

3.玩家只能持有1把剑即当一把剑被投掷时不能进入瞄准状态

Player脚本:

    public GameObject sword { get; private set; }//剑的对象

    public void AssignNewSword(GameObject _newSword)//分配
{
sword = _newSword;
}

    public void clearTheSword()//销毁
{
Destroy(sword);
}


Sword_Skill脚本:

player.AssignNewSword(newSword);//在CreatSword()中调用

PlayerGroundedState脚本:

        if(Input.GetKeyDown(KeyCode.Mouse1)&&!_Player.sword)//不持有剑才能按下鼠标右键
{
_PlayerStateMachine.ChangeState(_Player.AimSword);
}

4.玩家再此按下鼠标右键时可以回收剑

Sword_Skill_Control脚本:

    [SerializeField] private float returnSpeed=12f;//返回的速度

    private bool isReturning;//是否返回

    public void SetupSword(Vector2 _dir,float _gravityScale,Player _player)//传入player,作为返回目标,从Sword_Skill脚本中传入
{
rb.velocity = _dir;
rb.gravityScale = _gravityScale;

        player = _player;

        anim.SetBool("rotation", true);//设置旋转动画
}

    public void ReturnSword()
{
rb.isKinematic=false;
transform.parent = null;//取消原父对象

        isReturning = true;//开始返回
}

    private void Update()
{
if(canRotate)
{
transform.right = rb.velocity;

        }

       if(isReturning)
{
transform.position = Vector2.MoveTowards(transform.position, player.transform.position, returnSpeed*Time.deltaTime);//向玩家移动

            if(Vector2.Distance(transform.position, player.transform.position)<1)//距离小于1时销毁
{
player.clearTheSword();
}
}
}

PlayerGroundedState脚本:

    private bool HasNoSword()//是否投掷出剑
{
if (!_Player.sword)//未投掷可以进入瞄准
{
return true;
}

        _Player.sword.GetComponent<Sword_Skill_Control>().ReturnSword();//已经投掷则调用返回函数
return false;

}

        if(Input.GetKeyDown(KeyCode.Mouse1)&&HasNoSword())//Update中
{
_PlayerStateMachine.ChangeState(_Player.AimSword);
}

演示:

http://www.lryc.cn/news/601187.html

相关文章:

  • Python 使用 asyncio 包处理并 发(避免阻塞型调用)
  • 创建属于自己的github Page主页
  • 【自动化运维神器Ansible】Ansible常用模块之archive模块详解
  • github上传本地项目过程记录
  • 【C语言网络编程基础】DNS 协议与请求详解
  • STM32的蓝牙通讯(HAL库)
  • 飞牛NAS本地化部署n8n打造个人AI工作流中心
  • 用 Flask 打造宠物店线上平台:从 0 到 1 的全栈开发实践
  • idea总结
  • JVM工具
  • 【优选算法】BFS解决FloodFill算法
  • Element表格单元格类名动态设置
  • VILA系列论文解读
  • 基于mnn架构在本地 c++运行llm与mllm模型
  • PostgreSQL AND OR 操作符详解
  • esp32s3创建rust工程 window成功mac
  • 前后端分离:架构模式与实践
  • Qt 分裂布局:QSplitter 使用指南
  • 四、搭建springCloudAlibaba2021.1版本分布式微服务-加入openFeign远程调用和sentinel流量控制
  • UNet 改进(38):融合多尺度输入与可变形卷积、门控特征融合的医学图像Unet分割网络
  • MySQL 事务和锁
  • 02人工智能中优雅草商业实战项目视频字幕翻译以及声音转译之以三方AI模型API制作方式预算-卓伊凡|莉莉
  • 车载诊断架构 ---面向售后的DTC应该怎么样填写?
  • KNN算法实战:手写数字识别详解
  • 前端基础班学习路线
  • Git+宝塔面板部署Hugo博客
  • net8.0一键创建辅助开发的个人小工具
  • 剑指offer第2版:双指针+排序+分治+滑动窗口
  • 零基础学习性能测试第五章:JVM性能分析与调优-GC垃圾分代回收机制与优化
  • 【嵌入式硬件实例】-555定时器调光电路实现