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

unity中常见的角色控制方法

使用物理引擎(如 Rigidbody)来控制角色

using UnityEngine;public class PlayerController : MonoBehaviour
{public float moveSpeed = 5f;public float jumpForce = 5f;private Rigidbody rb;private bool isGrounded;void Start(){// 获取角色的 Rigidbody 组件rb = GetComponent<Rigidbody>();}void Update(){// 获取水平和垂直输入(键盘的方向键或 WASD)float moveHorizontal = Input.GetAxis("Horizontal");float moveVertical = Input.GetAxis("Vertical");// 创建一个新的 Vector3 来表示移动方向Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);// 应用移动速度rb.velocity = movement * moveSpeed;// 检测跳跃输入if (Input.GetKeyDown(KeyCode.Space) && isGrounded){// 应用跳跃力rb.AddForce(new Vector3(0, jumpForce, 0), ForceMode.Impulse);}}void OnCollisionStay(Collision collision){// 检测角色是否在地面上if (collision.gameObject.CompareTag("Ground")){isGrounded = true;}}void OnCollisionExit(Collision collision){// 检测角色是否离开地面if (collision.gameObject.CompareTag("Ground")){isGrounded = false;}}
}

使用角色控制器CharacterController 组件来控制角色

 

using UnityEngine;public class PlayerController : MonoBehaviour
{public float moveSpeed = 5f;public float jumpHeight = 1.5f;private CharacterController controller;private Vector3 playerVelocity;private bool groundedPlayer;void Start(){// 获取角色的 CharacterController 组件controller = GetComponent<CharacterController>();}void Update(){// 检测角色是否在地面上groundedPlayer = controller.isGrounded;if (groundedPlayer && playerVelocity.y < 0){playerVelocity.y = 0f;}// 获取水平和垂直输入(键盘的方向键或 WASD)float moveHorizontal = Input.GetAxis("Horizontal");float moveVertical = Input.GetAxis("Vertical");// 创建一个新的 Vector3 来表示移动方向Vector3 move = new Vector3(moveHorizontal, 0, moveVertical);controller.Move(move * Time.deltaTime * moveSpeed);// 改变角色面朝移动方向if (move != Vector3.zero){gameObject.transform.forward = move;}// 检测跳跃输入if (Input.GetButtonDown("Jump") && groundedPlayer){playerVelocity.y += Mathf.Sqrt(jumpHeight * -3.0f * Physics.gravity.y);}// 应用重力playerVelocity.y += Physics.gravity.y * Time.deltaTime;controller.Move(playerVelocity * Time.deltaTime);}
}

通过修改 Transform 组件的位置和旋转来控制角色

 

using UnityEngine;public class PlayerController : MonoBehaviour
{public float moveSpeed = 5f;public float rotationSpeed = 700f;public float jumpForce = 5f;private bool isGrounded;private Vector3 jump;void Start(){// 初始化跳跃向量jump = new Vector3(0.0f, jumpForce, 0.0f);}void Update(){// 获取水平和垂直输入(键盘的方向键或 WASD)float moveHorizontal = Input.GetAxis("Horizontal");float moveVertical = Input.GetAxis("Vertical");// 移动角色transform.Translate(new Vector3(moveHorizontal, 0, moveVertical) * moveSpeed * Time.deltaTime);// 旋转角色if (moveHorizontal != 0 || moveVertical != 0){Vector3 direction = new Vector3(moveHorizontal, 0, moveVertical);Quaternion rotation = Quaternion.LookRotation(direction, Vector3.up);transform.rotation = Quaternion.RotateTowards(transform.rotation, rotation, rotationSpeed * Time.deltaTime);}// 检测跳跃输入if (Input.GetKeyDown(KeyCode.Space) && isGrounded){GetComponent<Rigidbody>().AddForce(jump, ForceMode.Impulse);}}void OnCollisionStay(Collision collision){// 检测角色是否在地面上if (collision.gameObject.CompareTag("Ground")){isGrounded = true;}}void OnCollisionExit(Collision collision){// 检测角色是否离开地面if (collision.gameObject.CompareTag("Ground")){isGrounded = false;}}
}

相关文章:

  • 十种排序算法的python实现
  • 把qml程序制作成安装包(Windows)
  • C++查看编译后的代码
  • Springboot jar运行时,将jar内的文件拷贝到文件系统中
  • hot100经典:困难 Leetcode 4. 寻找两个正序数组的中位数
  • C++ 20新特性之三向比较运算符
  • UG数控编程入门:从基础到精通的全方位指南
  • 一个 python+tensorFlow训练1万张图片分类的简单直观例子( 回答由百度 AI 给出 )
  • 呆滞物料规范管理了,问题就好办了
  • 循环嵌套语句的实际应用(2)
  • 标准价与移动平均价简介
  • 让 AI 写高考作文丨10 款大模型 “交卷”,实力水平如何?
  • Nginx配置负载均衡
  • 近期面试HW中级蓝问题(非常详细)零基础入门到精通,收藏这一篇就够了
  • 计算机组成原理(一)
  • Docker 笔记(2):Dockerfile
  • es6
  • HTTP--网络协议分层,http历史(二)
  • Javascripit类型转换比较那点事儿,双等号(==)
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • java取消线程实例
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • Redis 懒删除(lazy free)简史
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • uva 10370 Above Average
  • 动态魔术使用DBMS_SQL
  • 1.Ext JS 建立web开发工程
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ‌移动管家手机智能控制汽车系统
  • # .NET Framework中使用命名管道进行进程间通信
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)STL算法之遍历容器
  • (MATLAB)第五章-矩阵运算
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (ZT)一个美国文科博士的YardLife
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (十三)Flask之特殊装饰器详解
  • (一)appium-desktop定位元素原理
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • .cn根服务器被攻击之后
  • .env.development、.env.production、.env.staging
  • .net core + vue 搭建前后端分离的框架
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core引入性能分析引导优化
  • .NET IoC 容器(三)Autofac
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net打印*三角形
  • .net快速开发框架源码分享