当前位置: 首页 > 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.xdnf.cn/news/1197811.html

相关文章:

  • 孤儿进程、僵尸进程和守护进程
  • 【element-ui】HTML引入本地文件出现font找不到/fonts/element-icons.woff
  • Android CameraX 使用指南:简化相机开发
  • 从零搭建3D激光slam框架-基于mid360雷达节点实现
  • [10月考试] C
  • 论文阅读-IGEV
  • Java进阶7:Junit单元测试
  • Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程
  • LabelImg:简洁高效的图像标注工具和下载
  • B站直播视频 | 深度讲解 Yocto 项目:从历史、架构到实战与趋势
  • Vue vuex模块化编码
  • 网络基础19:OSPF多区域实验
  • 中级全栈工程师笔试题
  • Maven之多模块项目管理
  • 什么是加密货币中的节点?
  • 【Linux系统编程】环境变量,进程地址空间与进程控制
  • 使用GIS中基于森林的分类与回归模型来估算房屋价值
  • 工业控制系统安全之 Modbus 协议中间人攻击(MITM)分析与防范
  • 解决ubantu系统下matplotlib中文乱码问题
  • 逆向入门(43)程序逆向篇-tsrh-crackme
  • 【笔记】系统
  • 20250727让飞凌OK3576-C开发板在Rockchip的原厂Android14下通过耳机播音
  • 【设计】设计一个web版的数据库管理平台后端(之二)
  • 29.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--单体转微服务--用户配置服务
  • Java中排序规则详解
  • solidity从入门到精通 第六章:安全第一
  • vmware虚拟机中 ubuntu 20.04通过nat设置静态ip(固定ip)
  • Java学习-------桥接模式
  • 文件权限标记机制在知识安全共享中的应用实践
  • 通信名词解释:I2C、USART、SPI、RS232、RS485、CAN、TCP/IP、SOCKET、modbus