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

网站锚点网络营销服务商有哪些

网站锚点,网络营销服务商有哪些,seo哪里可以学,福布斯中国100名人榜玩家控制脚本设计思路 1. 代码演变过程 1.1 初始阶段:单一Player类实现 最初的设计可能是一个包含所有功能的Player类: public class Player : MonoBehaviour {private CharacterController controller;private Animator animator;[SerializeField] …

玩家控制脚本设计思路

1. 代码演变过程

1.1 初始阶段:单一Player类实现

最初的设计可能是一个包含所有功能的Player类:

public class Player : MonoBehaviour
{private CharacterController controller;private Animator animator;[SerializeField] private float speed = 4f;private Vector3 move;private float gravity = -9.81f;private Vector3 velocity;void Awake(){controller = GetComponent<CharacterController>();animator = GetComponent<Animator>();}void Update(){HandleMovement();HandleGravity();}private void HandleMovement(){float horizontal = Input.GetAxis("Horizontal");float vertical = Input.GetAxis("Vertical");move = new Vector3(horizontal, 0, vertical);// ... 其他移动逻辑}
}

这种设计的问题:

  • 所有功能耦合在一起
  • 代码复用性差
  • 难以扩展新角色类型
  • 维护成本高

1.2 第一次重构:提取基类

识别出通用功能,创建抽象基类:

public abstract class Character : MonoBehaviour
{protected CharacterController controller;protected Animator animator;[SerializeField] protected float speed = 4f;protected Vector3 move;protected float gravity = -9.81f;protected Vector3 velocity;protected virtual void Awake(){controller = GetComponent<CharacterController>();animator = GetComponent<Animator>();}protected virtual void Update(){HandleMovement();}protected abstract void HandleMovement();
}

1.3 当前架构:功能模块化

1.3.1 Character基类(最终版本)
public abstract class Character : MonoBehaviour
{// 基础组件protected CharacterController controller;protected Animator animator;// 移动相关参数[SerializeField] protected float speed = 4f;protected Vector3 move;// 物理相关参数protected float gravity = -9.81f;    protected Vector3 velocity; protected virtual void Awake(){controller = GetComponent<CharacterController>();animator = GetComponent<Animator>();} protected virtual void Update(){HandleMovement();}// 抽象方法强制子类实现protected abstract void HandleMovement();
}
1.3.2 Player类(最终版本)
public class Player : Character
{#region 移动系统[SerializeField] private float speedMax = 6f;private float currentSpeed;private bool isShift;#endregion#region 跳跃系统private bool isGrounded;[SerializeField] private float jumpHeight = 3f;[SerializeField] private LayerMask groundMask;[SerializeField] private Transform groundCheck;[SerializeField] private float groundDistance = 0.15f;#endregion#region 攻击系统private bool isAttacking;private float lastAttackTime;#endregionprotected override void Update(){isGrounded = Physics.CheckSphere(groundCheck.position, groundDistance, groundMask);base.Update();HandleGravity();HandleAttack();}#region 移动系统实现protected override void HandleMovement(){if(isAttacking){move.Set(0, 0, 0);animator.SetFloat("Speed", 0);return;}// 基础移动输入float horizontal = Input.GetAxis("Horizontal");float vertical = Input.GetAxis("Vertical");move = new Vector3(horizontal, 0, vertical);// 移动规范化if(move.magnitude > 1f){move = move.normalized;}// 45度视角调整move = Quaternion.Euler(0, -45f, 0) * move;// 角色朝向if(move != Vector3.zero){transform.rotation = Quaternion.LookRotation(move);}// 冲刺系统HandleSprint();// 应用移动controller.Move(move * currentSpeed * Time.deltaTime);// 动画控制animator.SetFloat("Speed", move.magnitude);animator.SetBool("IsShift", isShift);}private void HandleSprint(){if(Input.GetKey(KeyCode.LeftShift)){currentSpeed = speedMax;isShift = true;}else {currentSpeed = speed;isShift = false;}}#endregion#region 重力系统实现private void HandleGravity(){animator.SetBool("isAir", !isGrounded);if(isGrounded && Input.GetButtonDown("Jump")){velocity.y = jumpHeight;}velocity.y += gravity * Time.deltaTime;controller.Move(velocity * Time.deltaTime);}#endregion#region 战斗系统实现private void HandleAttack(){if(Input.GetButtonDown("Fire1")){if(!isAttacking){isAttacking = true;animator.SetTrigger("Attack");}else{string triggerName = animator.GetCurrentAnimatorClipInfo(0)[0].clip.name;float triggerProgress = animator.GetCurrentAnimatorStateInfo(0).normalizedTime;// 连击系统if(triggerName != "LittleAdventurerAndie_ATTACK_03" && triggerProgress > 0.3f && triggerProgress < 0.7f){animator.SetTrigger("Attack");}}}}// 动画事件触发的特效public void PlayBlade01() => VFXManager.instance.Play("Particle Sword Blade 01");public void PlayBlade02() => VFXManager.instance.Play("Particle Sword Blade 02");public void PlayBlade03() => VFXManager.instance.Play("Particle Sword Blade 03");private void OnAttackEnd(){isAttacking = false;}#endregion
}

2. 详细设计分析

2.1 基类设计要点

  1. 组件封装

    • CharacterControllerAnimator组件封装在基类中
    • 使用protected访问级别允许子类直接访问
    • Awake中统一初始化
  2. 移动系统框架

    • 定义基础移动变量(speed, move, velocity)
    • 提供抽象的HandleMovement()方法
    • 实现基础的Update循环
  3. 物理系统基础

    • 封装重力相关参数
    • 提供基础的物理运动框架

2.2 Player类实现分析

  1. 移动系统

    protected override void HandleMovement()
    {// 1. 状态检查if(isAttacking) { ... }// 2. 输入处理float horizontal = Input.GetAxis("Horizontal");float vertical = Input.GetAxis("Vertical");// 3. 移动计算move = new Vector3(horizontal, 0, vertical);// 4. 规范化处理if(move.magnitude > 1f) { move = move.normalized; }// 5. 视角调整move = Quaternion.Euler(0, -45f, 0) * move;// 6. 朝向控制if(move != Vector3.zero) { ... }// 7. 移动应用controller.Move(move * currentSpeed * Time.deltaTime);// 8. 动画更新animator.SetFloat("Speed", move.magnitude);
    }
    
  2. 跳跃系统

    private void HandleGravity()
    {// 1. 地面检测animator.SetBool("isAir", !isGrounded);// 2. 跳跃输入if(isGrounded && Input.GetButtonDown("Jump")){velocity.y = jumpHeight;}// 3. 重力应用velocity.y += gravity * Time.deltaTime;controller.Move(velocity * Time.deltaTime);
    }
    
  3. 战斗系统

    private void HandleAttack()
    {// 1. 攻击输入检测if(Input.GetButtonDown("Fire1")){// 2. 状态检查if(!isAttacking){// 3. 开始攻击isAttacking = true;animator.SetTrigger("Attack");}else{// 4. 连击处理string triggerName = animator.GetCurrentAnimatorClipInfo(0)[0].clip.name;float triggerProgress = animator.GetCurrentAnimatorStateInfo(0).normalizedTime;if(可以连击条件){animator.SetTrigger("Attack");}}}
    }
    

3. 系统交互

3.1 状态管理

  • 移动状态与攻击状态互斥
  • 跳跃状态可以与其他状态叠加
  • 使用布尔值控制状态转换

3.2 动画系统

  • 使用参数控制动画过渡
    • Speed: 控制移动动画
    • IsShift: 控制冲刺动画
    • isAir: 控制跳跃动画
    • Attack: 触发攻击动画

3.3 特效系统

  • 通过动画事件触发特效
  • 使用VFXManager统一管理特效播放

4. 总结

当前的代码架构展现了良好的面向对象设计原则:

  1. 单一职责原则:每个类和方法都有明确的职责
  2. 开闭原则:通过继承和抽象方法支持扩展
  3. 里氏替换原则:子类可以替换父类而不影响程序正确性

后续优化方向:

  1. 引入状态模式管理角色状态
  2. 使用事件系统解耦模块间通信
  3. 将配置数据抽离到ScriptableObject
  4. 优化性能关键点
http://www.dt0577.cn/news/43405.html

相关文章:

  • 网站建设培训个人站长统计app进入网址新版
  • 政府网站备案流程什么软件可以排名次
  • 网页制作工具的选择福州seo兼职
  • 成都网站建设套餐如何推销网站
  • dedecms 子网站爱网站关键词查询工具长尾
  • 新网站应该怎么做关键词优化搜索排名
  • wordpress 搭建vultrseo费用
  • WordPress评论增加表情seo编辑是干什么的
  • 深圳建网站需要多少钱企业网站建设案例
  • 昆山企业做网站今天最近的新闻
  • 网站分页js郑州网站seo优化公司
  • 新浪门户网站是谁做的天津网站优化
  • 网站系统说明书徐州百度快照优化
  • 温州网站建设专业的公司by72777最新域名查询
  • 360排名优化seo研究院
  • 网络口碑营销的特点百度禁止seo推广
  • 网站建设开发用什么软件优化网站的意思
  • 日本哪个浏览器可以在中国用seo内容优化是什么
  • 德州做网站公司排行西地那非片能延时多久
  • 高端品牌网站建设服务1688精品货源网站入口
  • 腾冲做兼职的网站无锡网站优化公司
  • 北京有名的设计公司有哪些安卓手机性能优化软件
  • 0基础 网站建设百度推广代理商
  • 橙子建站 推广seo优化网站推广专员招聘
  • 吉安哪里做网站一年的百度指数
  • 重庆旅游网站建设网站关键词排名seo
  • 公司做二手网站的用意公司网站制作费用
  • asp网站上哪做站内推广方式有哪些
  • 宁波正规网站seo公司网络推广软件免费
  • 西安双语网站建设安徽seo优化