unity3d-搞个场景漫游如何实现Alpha

要处理两个问题:

  1. 如何设置地面人不掉下去
    方法一、 游戏物体加刚体,将游戏物体和地面加collider。如果是地形,可以使用 Terrain Collider;如果是简单的平面,可以添加 Box Collider 或者 Mesh Collider(如果平面是复杂的网格形状)。
    方法二、在游戏物体上增加刚体,在刚体组件的 Constraints 选项中,可以限制物体在某些轴向上的运动。例如,如果不想让物体在 Y 轴(垂直方向)下落,可以勾选 “Freeze Position” 中的 Y 选项。这样,刚体在物理模拟过程中,其 Y 轴位置就不会因为重力而改变,从而不会掉下去。
    缺点:当冻住y的时候, 遇到地上有坑的时候,也不会按地势走
  2. 鼠标控制方向,可以参考

https://blog.csdn.net/weixin_43908355/article/details/139179051

  1. 如何漫游,代码实现如下

方向键控制方向,挂载到游戏物体player上

  • Rigidbody 模式(任选)
public Rigidbody rd;
// Start is called before the first frame update
void Start()
{
}// Update is called once per frame
void Update()
{float f = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");rd.AddForce(new Vector3(f,0,v)*1);
}
  • transform模式(任选)

using UnityEngine;public class PlayerMovement : MonoBehaviour
{// 角色的移动速度public float speed = 5.0f;void Update(){// 获取水平(左右)和垂直(前后)输入float horizontalInput = Input.GetAxis("Horizontal");float verticalInput = Input.GetAxis("Vertical");// 计算移动方向Vector3 moveDirection = new Vector3(horizontalInput, 0, verticalInput);// 应用移动transform.position += moveDirection * speed * Time.deltaTime;}
}

镜头跟随玩家,挂载到镜头上

public class FollowTarget : MonoBehaviour {
private Transform player;
private Vector3 offset;
private float smoothing = 3;void Start (){player = GameObject.FindGameObjectWithTag("Player”).transform;offset = transform.position - player.position;}void LateUpdate (){Vector3 targetPosition = player.position + player.TransformDirection( offset)transform.position = Vector3.Lerp(transform.position, targetPosition,Time.deltaTime*smoothing);transform.LookAt(player.position);}
}

七八

  1. 为地面增加ground标签,collider,取消Is Kinematic,
  2. 角色挂上rigidbody组件
  3. 有一些属性可以影响其与碰撞体的相互作用。例如,Mass(质量)和Drag(空气阻力)
using UnityEngine;public class PlayerMovementWithJumpAndMouse : MonoBehaviour
{// 角色的移动速度public float speed = 5.0f;// 角色的跳跃力public float jumpForce = 10.0f;// 判断角色是否在地面上private bool isGrounded = true;// 地面的检测半径private float groundCheckDistance = 0.4f;// 地面检测层的层掩码private LayerMask groundLayerMask;// 用于存储鼠标的当前和上一个位置private Vector3 mouseCurrentPosition;private Vector3 mouseLastPosition;// 新增的变量,用于存储调整后的移动速度和斜坡的法线private float adjustedSpeed;private Vector3 slopeNormal;void Start(){// 设置地面检测层的层掩码groundLayerMask = LayerMask.GetMask("Ground");// 初始化鼠标位置mouseLastPosition = Input.mousePosition;}void Update(){// 获取鼠标输入mouseCurrentPosition = Input.mousePosition;Vector3 mouseDelta = mouseCurrentPosition - mouseLastPosition;// 将鼠标移动转换为旋转角度(这里假设每100像素移动对应1度旋转)float rotationX = mouseDelta.y * -1 * Time.deltaTime * 100f; // 乘以-1是因为我们希望向上移动鼠标时角色向下看(Y轴反转)float rotationY = mouseDelta.x * Time.deltaTime * 100f;// 限制旋转角度,防止角色倒立或过度旋转rotationX = Mathf.Clamp(rotationX, -30f, 30f); // 限制X轴旋转在-30到30度之间// 计算旋转后的方向Quaternion targetRotation = Quaternion.Euler(rotationX, transform.eulerAngles.y + rotationY, transform.eulerAngles.z);// 平滑过渡到目标旋转方向(可选)transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);// 重置鼠标位置为当前位置,以便下一次计算移动量mouseLastPosition = mouseCurrentPosition;// 获取水平(左右)和垂直(前后)输入(这里仍然保留键盘输入,以便可以同时使用)float horizontalInput = Input.GetAxis("Horizontal");float verticalInput = Input.GetAxis("Vertical");// 计算移动方向Vector3 moveDirection = new Vector3(horizontalInput, 0, verticalInput);// 检测斜坡并获取其法线RaycastHit slopeHit;if (Physics.Raycast(transform.position, transform.forward, out slopeHit, 100f, groundLayerMask)){// 获取斜坡的法线slopeNormal = slopeHit.normal;// 根据斜坡倾斜程度调整移动速度float slopeAngle = Vector3.Angle(Vector3.up, slopeNormal);AdjustMovementBySlope(slopeAngle);// 应用移动transform.position += moveDirection * adjustedSpeed * Time.deltaTime;// 根据斜坡法线调整角色方向AdjustCharacterDirection(slopeNormal);}else{// 如果没有检测到斜坡,则使用默认速度,并重置斜坡法线adjustedSpeed = speed;slopeNormal = Vector3.up; // 或者你可以设置为其他默认方向}// 检测跳跃输入if (Input.GetButtonDown("Jump") && isGrounded){// 给角色一个向上的力Vector3 jump = new Vector3(0, jumpForce, 0);rigidbody.velocity = Vector3.zero; // 重置垂直速度,防止跳跃时受其他力影响rigidbody.AddForce(jump, ForceMode.Impulse);isGrounded = false; // 标记角色已经起跳}}// 用于检测角色是否在地面上private void OnCollisionStay(Collision collision){// 检查是否与地面层的对象接触if ((groundLayerMask & (1 << collision.gameObject.layer)) != 0){// 检查是否在地面检测半径内if (Mathf.Abs(collision.contacts[0].point.y - transform.position.y) <= groundCheckDistance){isGrounded = true; // 标记角色在地面上}}}// 如果没有地面碰撞,则重置isGrounded,防止角色在空中时误判为已落地private void OnCollisionExit(Collision collision){if ((groundLayerMask & (1 << collision.gameObject.layer)) != 0){isGrounded = false;}}// 检测斜坡的倾斜角度,并调整移动速度(此方法已被整合到Update中,但保留此方法签名以便理解)/*private float DetectSlopeAngle(){// ...(原代码已整合到Update中)}*/// 根据斜坡倾斜程度调整移动速度或方向private void AdjustMovementBySlope(float slopeAngle){// 设置一个最大斜坡角度阈值,超过此角度则减少速度float maxSlopeAngle = 45f;// 根据斜坡角度调整速度if (slopeAngle > maxSlopeAngle){// 计算速度调整因子(0到1之间)float speedReductionFactor = 1f - (slopeAngle - maxSlopeAngle) / (90f - maxSlopeAngle);speedReductionFactor = Mathf.Clamp01(speedReductionFactor); // 确保因子在0到1之间// 应用速度调整因子adjustedSpeed = speed * speedReductionFactor;}else{// 没有超过最大斜坡角度,使用正常速度adjustedSpeed = speed;}}// 根据斜坡法线调整角色方向private void AdjustCharacterDirection(Vector3 slopeNormal){// 计算角色应该面向的方向,即斜坡法线的水平分量(忽略Y轴)Vector3 targetDirection = new Vector3(slopeNormal.x, 0, slopeNormal.z).normalized;// 如果角色当前面向的方向与目标方向差异较大,则平滑过渡到目标方向// 这里我们使用Quaternion.Slerp来实现平滑过渡Quaternion targetRotation = Quaternion.LookRotation(targetDirection);transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, Time.deltaTime * 5f);// 注意:上面的平滑过渡可能会导致角色在陡峭的斜坡上时旋转过快。// 为了解决这个问题,你可以根据斜坡角度来限制旋转速度,或者完全禁用平滑过渡,直接设置旋转。// 例如:// float maxRotationSpeed = 30f; // 最大旋转速度(度/秒)// float rotationAngle = Vector3.Angle(transform.forward, targetDirection);// float rotationSpeed = Mathf.Min(maxRotationSpeed, rotationAngle / Time.deltaTime);// transform.rotation = Quaternion.RotateTowards(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);}
}

参考

https://www.jianshu.com/p/0e8d4dd55c2c

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503669.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络 (29)网络地址转换NAT

前言 网络地址转换&#xff08;Network Address Translation&#xff0c;NAT&#xff09;是计算机网络中的一种重要协议&#xff0c;它主要用于将私有IP地址转换为公共IP地址&#xff0c;以实现内部网络与外部网络之间的通信。 一、基本概念 NAT是一种在局域网&#xff08;LAN&…

三极管工作状态分析

NPN三极管 下面是NPN三极管&#xff08;也称N管&#xff09;的标识和内部结构图&#xff1a; NPN三极管由两个PN结构成&#xff0c;靠近C&#xff08;集电极&#xff09;一侧的PN结称为集电结&#xff1b;靠近E&#xff08;发射极&#xff09;一侧的PN结称为发射结&#xff1…

基于RedHat9部署WordPress+WooCommerce架设购物网站

系统版本信息&#xff1a;Red Hat Enterprise Linux release 9.2 (Plow) WordPress版本信息&#xff1a;wordpress-6.6.2-zh_CN WooCommerce版本信息&#xff1a;woocommerce.9.5.1 环境架构&#xff1a;LNMP&#xff08;RedHat9nginx1.20.1PHP 8.0.27MySQL8.0.30&#xff09; …

【雷达】雷达的分类

文章目录 前言类别性质主要雷达分系统及其现代技术发展国外发展 前言 前言 类别 性质 按作用分类 军用雷达&#xff1a;&#xff08;按载体&#xff09;地面雷达、舰载雷达、机载雷达、星载雷达、 艇载雷达、弹载雷达 民用雷达&#xff1a;交通管制雷达、港口管制雷达、气象雷…

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统&#xff0c;通过车身四周安装的超广角像机&#xff0c;经算法合成全景鸟瞰图&#xff0c;通过鸟瞰图&#xff0c;司机非常清楚的看清楚车辆四周情况&#xff0c;大大降低盲区引发的交通事故。 产…

微信小程序之历史上的今天

微信小程序之历史上的今天 需求描述 今天我们再来做一个小程序&#xff0c;主要是搜索历史上的今天发生了哪些大事&#xff0c;结果如下 当天的历史事件或者根据事件选择的历史事件的列表&#xff1a; 点击某个详细的历史事件以后看到详细信息&#xff1a; API申请和小程序…

PyCharm简单调试

本文简单讲述一下PyCharm中经常用到的调试操作。 示例代码如下&#xff1a; for i in range(10):print("hello", i)if i > 2:print("ok!")在代码前面打上断点&#xff0c;如下图所示&#xff1a; 单机调试按钮Debug 单机Resume Program按钮&#xf…

域名注册网国际域名与国内域名的区别

在当今互联网时代&#xff0c;域名注册是每个企业和个人建立在线存在的重要步骤。国际域名与国内域名之间存在一些显著的区别&#xff0c;这些区别影响着用户的选择和使用。 首先&#xff0c;国际域名通常以“.com”、“.net”、“.org”等后缀结尾&#xff0c;这些后缀具有全球…

Python 爬虫验证码识别

在我们进行爬虫的过程中&#xff0c;经常会碰到有些网站会时不时弹出来验证码识别。我们该如何解决呢&#xff1f;这里分享 2 种我尝试过的方法。 0.验证码示例 1.OpenCV pytesseract 使用 Python 中的 OpenCV 库进行图像预处理&#xff08;边缘保留滤波、灰度化、二值化、…

【Unity笔记】资源包导入后是洋红色(粉色)怎么办?

1.导入后发现是这样的 2.这个问题是渲染管道不匹配引起的。 导入的素材用的是 「通用渲染管线 Universal Render Pipeline, URP」&#xff0c;而项目里默认配置的是「内置渲染管线」&#xff0c;如图&#xff1a; 【知识补充】什么是渲染管线&#xff1f;&#xff1f;&#x…

Vue2移动端(H5项目)项目封装switch组件支持动态设置开启关闭背景色、值及组件内显示文字描述、禁用、switch 的宽度

前言 近期产品需求&#xff1a;Vue2移动端项目需要在switch开关内显示文字&#xff0c;看Vantui没有对应功能&#xff0c;因此自己手撸写了这个组件。 一、最终效果 二、参数配置 1、代码示例&#xff1a; <t-switch v-model"check"/>2、配置参数&#xff08;…

Spring Boot教程之五十一:Spring Boot – CrudRepository 示例

Spring Boot – CrudRepository 示例 Spring Boot 建立在 Spring 之上&#xff0c;包含 Spring 的所有功能。由于其快速的生产就绪环境&#xff0c;使开发人员能够直接专注于逻辑&#xff0c;而不必费力配置和设置&#xff0c;因此如今它正成为开发人员的最爱。Spring Boot 是…

概率论与数理统计--期末

概率论占比更多&#xff0c;三分之二左右 数理统计会少一些 事件之间的概率 ab互斥&#xff0c;不是ab独立 古典概型吃高中基础&#xff0c;考的不会很多 条件概率公式&#xff0c;要记 公式不要全记&#xff0c;很多有名称的公式是通过基础公式转换而来的 目的在于解决一…

大数据高级ACP学习笔记(2)

钻取&#xff1a;变换维度的层次&#xff0c;改变粒度的大小 星型模型 雪花模型 MaxCompute DataHub

标准IO

student.c用链表完成 #include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct student {char name[10];int chinese;int math;int English;int physics;int chemistry;int biology; }stu,*stuptr; typedef struct node {union{stu dat…

Ollama + FastGPT搭建本地私有企业级AI知识库 (Linux)

一、为何搭建本地企业级AI知识库&#xff1f; 首先我们分析下搭建本地企业级AI知识库的核心要点&#xff1a; 1.数据安全性&#xff1a;本地部署可以更好地保护企业敏感数据&#xff0c;避免数据泄露的风险。 2.定制化&#xff1a;根据企业特定需求进行定制&#xff0c;提供更…

基于SMT32U575RIT单片机-中断练习

练习要求&#xff1a; 1、通过扩展板按键key1&#xff0c;开/关元器件&#xff1b; 2、通过串口选择模式&#xff08;通过中断实现&#xff09;&#xff1a; LED&#xff1a; 切换只控制LED&#xff1b; FAN&#xff1a; 切换只控制FAN&#xff1b; BEE&#xff1a; 切换只控制…

人工智能的发展领域之GPU加速计算的应用概述、架构介绍与教学过程

文章目录 一、架构介绍GPU算力平台概述优势与特点 二、注册与登录账号注册流程GPU服务器类型配置选择指南内存和存储容量网络带宽CPU配置 三、创建实例实例创建步骤镜像选择与设置 四、连接实例SSH连接方法远程桌面配置 一、架构介绍 GPU算力平台概述 一个专注于GPU加速计算的…

w~自动驾驶~合集16

我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题&#xff1a;SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接&#xff1a;https://ar…

数据结构与算法之二叉树: LeetCode 107. 二叉树的层序遍历 II (Ts版)

二叉树的层序遍历 II https://leetcode.cn/problems/binary-tree-level-order-traversal-ii/description/ 描述 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&a…