学习游戏制作记录(剑投掷技能)7.26

1.实现瞄准状态和接剑状态

准备好瞄准动画,投掷动画和接剑动画,并设置参数AimSword和CatchSword

投掷动画在瞄准动画后,瞄准结束后才能投掷

创建PlayerAimSwordState脚本和PlayerCatchSwordState脚本并在Player中初始化:

PlayerAimSwordState脚本:

if(Input.GetKeyDown(KeyCode.Mouse1))//鼠标右键
{
_PlayerStateMachine.ChangeState(_Player.idleState);
}//在Update中,用于调试

PlayerGroundedState脚本:

if(Input.GetKeyDown(KeyCode.Mouse1))
{
_PlayerStateMachine.ChangeState(_Player.AimSword);
}

为SkillManage对象创建新脚本Sword_Skil并在SkillManage脚本中初始化它:

**[Header("Skill info")]

SerializeField\] private GameObject swordPrefab;//剑的预制体 \[SerializeField\] private Vector2 lanchForce;//剑的发射方向 \[SerializeField\] private float swordGravity;//剑的重力改变** ## 2.实现剑的投掷(剑预制体的创建与代码调用) 创建剑的对象,你可以创建一个父对象和子对象来表示一把剑,子对象负责挂载动画组件,父对象负责挂载刚体碰撞器等。 ![](https://i-blog.csdnimg.cn/direct/d1831d2fe4b04a7aa319d752ee35e9f1.png) 为其添加旋转和待机动画,并添加rotation参数用来控制动画 ![](https://i-blog.csdnimg.cn/direct/99d8443a07f74b2d97eab9a172cd9d64.png) ### Skill脚本: **protected Player player { get; private set; }//实例化Player,方便调用** **protected virtual void Start() { player = PlayerManage.instance.player; }** ### 为剑预制体添加Sword_Skill_Control脚本: **private Animator anim; private Rigidbody2D rb; private CircleCollider2D cd;** **private Player player;** **private void Awake() { anim = GetComponent\(); rb = GetComponent\(); cd = GetComponent\(); }** **public void SetupSword(Vector2 _dir,float _gravityScale)//给生成的预制体一个力和重力的改变 { rb.velocity = _dir; rb.gravityScale = _gravityScale; }** ### Sword_Skill脚本: **public void CreateSword() { GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);在玩家位置创建剑对象** **Sword_Skill_Control newSkillScript =newSword.GetComponent\();** **newSkillScript.SetupSword(lanchForce, swordGravity); }** ### PlayerAniamtionTrigger脚本: **private void ThrowSword() { SkillManage.instance.sword.CreateSword(); }//在玩家投掷动画中选择一帧添加事件来调用该函数** ![](https://i-blog.csdnimg.cn/direct/640ca5c6a2424c10895e803529416a99.png) ## 3.实现瞄准时方向点的生成 我们想要在玩家瞄准时随着鼠标移动展示不同的飞行轨迹并最终让剑沿着这条轨迹发射,这需要我们创建一个点的预制体,然后再游戏时生成很多个点,并套用公式让这些点排列成轨迹。 实现最终方向跟随鼠标: ### Sword_Skill脚本: **private Vector2 finalDir;** **private Vector2 AnimDirection() { Vector2 playerPostion=player.transform.position; Vector2 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition); Vector2 direction = mousePosition - playerPostion;//由玩家指向鼠标** **return direction; }** **protected override void Update() { if(Input.GetKeyUp(KeyCode.Mouse1)) { finalDir = new Vector2(AnimDirection().normalized.x \*lanchForce.x,AnimDirection().y \*lanchForce.y);//normalized是归一化处理,你可以理解把向量压缩为1,乘以我们的初始方向即最终方向 } }** **public void CreateSword() { GameObject newSword = Instantiate(swordPrefab,player.transform.position,transform.rotation);** **Sword_Skill_Control newSkillScript =newSword.GetComponent\();** **newSkillScript.SetupSword(finalDir, swordGravity);//调用最终方向 }** #### 实现瞄准点的排序: **\[Header("AnimDots info")

SerializeField\] private int numbersofDots;//生成点的数量 \[SerializeField\] private float spaceBetweenTwoDots;//每个点间隔的时间 \[SerializeField\] private GameObject dotPrefab;//点的预制体,自行创建,记得更改图层为地面 \[SerializeField\] private Transform dotsParent;//自行在玩家下创建一个子对象,作为生成所有点的父对象** **private GameObject\[\] dots;//生成点的数组** **private void GenerateDots()//生成所有点 { dots = new GameObject\[numbersofDots\]; for (int i = 0; i \< numbersofDots; i++) { dots\[i\]=Instantiate(dotPrefab,player.transform.position,Quaternion.identity,dotsParent); dots\[i\].SetActive(false); } }** **protected override void Start()//调用上述函数 { base.Start();** **GenerateDots(); }** **public void DotsActove(bool _isActive)//设置点是否可见 { for(int i = 0; i \< dots.Length; i++)//循环 { dots\[i\].SetActive(_isActive); } }** **private Vector2 DotsPosition(float t)//返回每个点的位置 { Vector2 position = (Vector2)player.transform.position + new Vector2(AnimDirection().normalized.x \* lanchForce.x, AnimDirection().y \* lanchForce.y) \* t + .5f \* (Physics2D.gravity \* swordGravity) \* (t \* t);** **//位置 = 初始位置 + 初速度 × 时间 + 0.5 × 加速度 × 时间²** **return position; }** **protected override void Update() { if(Input.GetKeyUp(KeyCode.Mouse1)) { finalDir = new Vector2(AnimDirection().normalized.x \*lanchForce.x,AnimDirection().y \*lanchForce.y); }** **if(Input.GetKey(KeyCode.Mouse1))//按住鼠标右键时时刻更新这些点的位置 { for(int i = 0; i \< dots.Length; i++) { dots\[i\].transform.position = DotsPosition(i \* spaceBetweenTwoDots); } } }** ### PlayerAimSwordState脚本: **public override void Enter() { base.Enter();** **SkillManage.instance.sword.DotsActove(true); }** **public override void Exit() { base.Exit();** **SkillManage.instance.sword.DotsActove(false); }//进入瞄准时可见这些点,退出消失** 演示: ![](https://i-blog.csdnimg.cn/direct/883aad30f0fa48afba3918f7ccfbcb4e.png)

相关推荐
悠哉悠哉愿意2 小时前
【电赛学习笔记】MaxiCAM 项目实践——与单片机的串口通信
笔记·python·单片机·嵌入式硬件·学习·视觉检测
快乐肚皮2 小时前
ZooKeeper学习专栏(五):Java客户端开发(原生API)详解
学习·zookeeper·java-zookeeper
慕y2742 小时前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper
蓝桉8023 小时前
opencv学习(图像金字塔)
人工智能·opencv·学习
小乖兽技术3 小时前
C#与C++交互开发系列(二十四):WinForms 应用中嵌入C++ 原生窗体
c++·c#·交互
rannn_1114 小时前
Java学习|黑马笔记|Day23】网络编程、反射、动态代理
java·笔记·后端·学习
go54631584654 小时前
中文语音识别与偏误检测系统开发
开发语言·人工智能·学习·生成对抗网络·数学建模·语音识别
I'mSQL5 小时前
C#与WPF使用mvvm简单案例点击按钮触发弹窗
开发语言·c#·wpf
好奇龙猫5 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段(9):ようなN
学习