Unity 3D RPG游戏的设计与实现

这篇具有很好参考价值的文章主要介绍了Unity 3D RPG游戏的设计与实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实现鼠标点击的交互

public class PlayerInput : MonoBehaviour

{

    public float horizontalInput;

    public float verticalInput;

   public bool mouseDown;

   文章来源地址https://www.toymoban.com/news/detail-839632.html

   

    // Update is called once per frame

    void Update()

    { ///在游戏运行且鼠标当前未被按下的情况下,检测鼠标左键是否被用户按下,并记录这一交互状态。

        if(!mouseDown&&Time.timeScale!=0 //游戏运行中,Time.timeScale等于0时,游戏时间会停止更新,此时不应该响应玩家输入

        ){

            mouseDown=Input.GetMouseButtonDown(0);

        }

       

       

        horizontalInput=Input.GetAxis("Horizontal");

        verticalInput=Input.GetAxis("Vertical");

        //检测水平输入和垂直输入

    }

    /// <summary>

    /// 当角色死亡(禁用)是调用OnDisable方法,关闭输入

    /// </summary>

   private void OnDisable() {

    mouseDown=false;//清除鼠标输入

    horizontalInput=0;

    verticalInput=0;

   }

}

状态机的初步设计

 private void StateSwitchTo(CharacterState newState)

{

    if(isPlayer){

            playerInput.mouseDown=false;//清除鼠标输入,因为Enemy是由ai控制的,所以不需要mouseDown

    }

    //对于当前状态的处理

   

    switch(currentState){

        case CharacterState.Normal:

        break;

        case CharacterState.Attacking:

        animator.SetTrigger("Attack");

        break;

    }

           

    //对于新状态的处理

    switch(newState){

        case CharacterState.Normal:

        break;

        case CharacterState.Attacking:

          animator.SetTrigger("Attack");

          if(isPlayer)

          attackStartTime=Time.time;//记录角色攻击开始时间的时间点

          if(!isPlayer){

            Quaternion newRotition=Quaternion.LookRotation(playerTarget.transform.position-transform.position);//计算角色的朝向

            transform.rotation=newRotition;

          }

        break;

    }

    currentState=newState;

    Debug.Log("state changed to "+currentState);

}  

normal与attacking的状态转换

 private void CalculateMove(){

        ///判断玩家是否在地面上并同时判断是否按下鼠标左键将状态切换到攻击状态,返回不执行移动逻辑

        if(playerInput.mouseDown&&cc.isGrounded){

            StateSwitchTo(CharacterState.Attacking);

            return;

        }

 void FixedUpdate(){

        ///根据游戏角色的状态(正常或攻击)以及是否是玩家控制的角色来决定执行不同的移动计算逻辑

        switch(currentState){

            case CharacterState.Normal:

            if(isPlayer)

            CalculateMove();

            else

            CalculateEnemyMove();

            break;

            case CharacterState.Attacking:

            if(isPlayer){

                moveVelocity=Vector3.zero;//将移动速度归零,防止前一帧速度对滑动的干扰

                if(Time.time<attackStartTime+slideDuration)//判断当前时间是否处于攻击开始时间与滑动持续时间之和的区间

                {

                    float passedTime=Time.time-attackStartTime;

                    float lerpTime=passedTime/slideDuration;  // 计算出一个介于0和1之间的浮点数lerpTime,它代表了当前时间相对于整个动画周期的位置,。通过将这个lerpTime与起始和结束状态进行插值运算,可以得到每个时间点应有的状态值,从而实现平滑过渡效果。

                    moveVelocity=Vector3.Lerp(transform.forward*slideSpeed,Vector3.zero,lerpTime);

                    //Vector3.Lerp(...): 这是Unity中用于执行三维空间向量线性插值的方法。其三个参数分别为起始向量、结束向量和时间系数(通常介于0到1之间)。

                    //函数执行后,moveVelocity将被赋予从起始向量平滑过渡到结束向量的结果。在给定的lerpTime时间内,物体的滑动速度会逐渐减小,最终变为零。这可以用来实现诸如减速停止、渐隐消失等效果。

                }

            }

 

            break;

        }

攻击状态的设计与实现:

玩家攻击

玩家攻击动画的实现:

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

点击图示位置打开动画控制器

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

添加一个Trigger类型的Attack,右键-Create Sub-State Machine,如图连接各个状态,转换条件取消exit time,condition设置为attack

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

       双击attack状态机,如图

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

创建combo 01状态,连接exit状态,combo 01参数如下图所示

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

combo 01->exit参数如图设置

保留exit time:确保动画完整播放

Transition Duration值为0:防止动画播放交叉

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

编辑attack动画,如图添加一个AttackAnimationEnds,实现攻击结束后回到之前的状态。

代码:

private void StateSwitchTo(CharacterState newState)

{

    if(isPlayer){

            playerInput.mouseDown=false;//清除鼠标输入,因为Enemy是由ai控制的,所以不需要mouseDown

    }

    //对于当前状态的处理

   

    switch(currentState){

        case CharacterState.Normal:

        break;

        case CharacterState.Attacking:

        animator.SetTrigger("Attack");

        break;

    }

           

    //对于新状态的处理

    switch(newState){

        case CharacterState.Normal:

        break;

        case CharacterState.Attacking:

         animator.SetTrigger(" Attack");

          if(isPlayer)

          attackStartTime=Time.time;//记录角色攻击开始时间的时间点

          if(!isPlayer){

            Quaternion newRotition=Quaternion.LookRotation(playerTarget.transform.position-transform.position);//计算角色的朝向

            transform.rotation=newRotition;

          }

        break;

    }

    currentState=newState;

    Debug.Log("state changed to "+currentState);

}  

public void AttackAnimationEnds(){

    StateSwitchTo(CharacterState.Normal);

   }//攻击状态转换为常态

玩家攻击特效的实现

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

预制体位置如图,将该预制体作为player-Vfx的子对象,在检查器相应位置引入

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.VFX;//引入VFX

public class PlayerVFXManager : MonoBehaviour

   

{

    public VisualEffect visualEffect;//定义变量visualEffect

    public ParticleSystem particleSystem;

   

    public void UpdateStep(bool state){

        if(state){

            visualEffect.Play();//播放VFX动画

        }

        else{

            visualEffect.Stop();

        }

    }

    public void PlayBlade01(){

        particleSystem.Play();

    }

       

   

}

敌人攻击

敌人攻击动画的实现

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

打开敌人的动画控制器后将敌人的攻击动作设计完毕,后续与玩家的设计原理相同

  private void CalculateEnemyMove(){

        if(Vector3.Distance(transform.position,playerTarget.position)>agent.stoppingDistance){

            agent.SetDestination(playerTarget.position);

            animator.SetFloat("Speed",0.2f);

        }else{

            agent.SetDestination(transform.position);

            animator.SetFloat("Speed",0f);

            StateSwitchTo(CharacterState.Attacking);//靠近玩家时切换为攻击状态

        }

敌人攻击特效的实现

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

       位置如图,

Unity 3D RPG游戏的设计与实现,unity,游戏,游戏引擎

参数设置如图,实现方法与player相同(不同点:删掉visual effect中的initial event name)

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.VFX;

public class EnemyVFXManager : MonoBehaviour

{

 public VisualEffect visualEffect;

 public VisualEffect AttackVFX;

 public void PlayerAttackAnimation(){

  AttackVFX.Play();

 }

 public void BurstFootStep(){

   visualEffect.Play();

 }

   

}

出现了一点小问题,敌人并没有朝向玩家攻击,解决方法

  case CharacterState.Attacking:

if(!isPlayer){

            Quaternion newRotition=Quaternion.LookRotation(playerTarget.transform.position-transform.position);//计算角色的朝向

            transform.rotation=newRotition;

          }

        break;

    }

实现攻击时滑动的功能

private float attackStartTime;

 public float slideDuration=0.5f;

    public float slideSpeed=0.4f;

 switch(newState){

        case CharacterState.Normal:

        break;

        case CharacterState.Attacking:

          animator.SetTrigger("Attack");

          if(isPlayer)

          attackStartTime=Time.time;//记录角色攻击开始时间的时间点

           moveVelocity=Vector3.zero;//将移动速度归零,防止前一帧速度对滑动的干扰

                if(Time.time<attackStartTime+slideDuration)//判断当前时间是否处于攻击开始时间与滑动持续时间之和的区间

                {

                    float passedTime=Time.time-attackStartTime;

                    float lerpTime=passedTime/slideDuration;  // 计算出一个介于0和1之间的浮点数lerpTime,它代表了当前时间相对于整个动画周期的位置,。通过将这个lerpTime与起始和结束状态进行插值运算,可以得到每个时间点应有的状态值,从而实现平滑过渡效果。

                    moveVelocity=Vector3.Lerp(transform.forward*slideSpeed,Vector3.zero,lerpTime);

                    //Vector3.Lerp(...): 这是Unity中用于执行三维空间向量线性插值的方法。其三个参数分别为起始向量、结束向量和时间系数(通常介于0到1之间)。

                    //函数执行后,moveVelocity将被赋予从起始向量平滑过渡到结束向量的结果。在给定的lerpTime时间内,物体的滑动速度会逐渐减小,最终变为零。这可以用来实现诸如减速停止、渐隐消失等效果。

                }         

   

到了这里,关于Unity 3D RPG游戏的设计与实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(75)
  • 3D RPG Course | Core | Unity学习笔记(九)

    目录 (一)玩家数据保存 (二)制作主菜单 (三)制作NewGame场景转换 (四)制作场景渐入渐出 (五)玩家死亡返回Menu        创建新的脚本SaveManager专门负责保存数据。为了能够随时调用并保存数据,所以使用泛型单例与设置DontDestroyOnLoad。玩家数据的保存则使用JsonUti

    2024年02月03日
    浏览(26)
  • 3D RPG Course | Core | Unity学习笔记(七)

            希望为石头人设置近战击飞和远程两种攻击动作。由于动画逻辑与兽人敌人一致,所以可以使用override方式设计AnimatorController。         脚本也继承自EnemyController,首先实现近战击飞效果。         其他部分也像其他单位一样设置,这样近战机能就可以正常运行

    2024年02月03日
    浏览(25)
  • 3D RPG Course | Core | Unity学习笔记(八)

            在属性代码CharacterData_SO中添加代表经验值系统的变量,对于不同类型的对象,比如敌人没有升级系统而玩家有,则不需要的变量不对其赋值即可。设计好等级、经验值、等级增幅和击败敌人获得的经验值,并在造成伤害的方法中判断死亡并提供经验值(由于逻辑是承

    2024年02月05日
    浏览(30)
  • 【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity游戏demo – 😶‍🌫️版本: Unity2021 😶‍🌫️适合人群:Unity初学者进阶 😶‍🌫️学习目标:3D赛车游戏的基础制作 😶‍🌫️技能

    2024年02月09日
    浏览(45)
  • Unity 3D 设计小球酷跑游戏

    1. 分别创建有关Folder(Materials、Prefabs、Scenes、Script) 2. 创建小球Player()、Walls(WallUp、WallDown)。 3D Object Sphere (更改名为Player) 3D Object Cube (更改名为WallUp) 3D Object Cube (更改名为WallDown) Create Empty 更改名为Walls,并把WallUp、WallDown拖入到Walls子目录下。 3. 为Player添加组件(Add Compon

    2024年02月08日
    浏览(29)
  • Unity游戏程序设计——3D双人坦克大战

    3D多人坦克大战 ·Unity2019.4.29   ·Visual Studio 2019 双人坦克游戏: 坦克:可移动旋转,发射炮弹 子弹:按一定方向一定速度发射;炮弹周围会产生冲击波,击中坦克或接触地面后爆炸 坦克生命:坦克被击中后血条相应变化;血条不随坦克的旋转而旋转;血条减到小于等于0后爆

    2024年04月28日
    浏览(29)
  • 【UnityRPG游戏制作】Unity_RPG项目之界面面板分离和搭建

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 :Unity基础实战 插件为Unity自带的UGUI各控件实现 StartPanel ——(开始面板创建) StartTipPanel ——(游戏说明面板创建) defeatPanel ——(失败界面面

    2024年04月24日
    浏览(43)
  • Unity实现一个3D塔防游戏

    Unity是一款游戏引擎,可以用来开发各种类型的游戏。在这篇文章中,我们将使用Unity来创建一个3D塔防游戏。本文将从游戏设计开始,一步一步地讲解如何实现一个基本的塔防游戏。 对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在

    2023年04月26日
    浏览(32)
  • 【Unity3D】如何用使用Unity实现退出游戏的功能

    1、使用Unity编译器时: 2、打包后: 很多时候,我们都知道Application.Quit()代码,但是我们在Unity编译器调试的时候发现即使挂上了这个代码的组件或物体都无法退出编译,因为该代码只在打包后可以实现退出功能。 所以我们可以把两个实现代码同时写入脚本,这样既可以在编

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包