本文汇总了 2024 年 5 月 25 日 - 2024 年 6 月 7 日 Unity 中文社区精选问答。如果在使用 Unity 过程中遇到任何问题,欢迎点击阅读原文前往 Unity 中文社区提问,将有官方技术支持及社区贡献者当日解答。此外,本周还有少量待解决问题,欢迎小伙伴们到社区分享经验,为他人答疑解惑。
本期问题目录:
8. 无法实现在屏幕二上的射线检测
我有一个角色,他有一个附加在角色上的武器,我希望这个我的角色可以检测附近并且锁定敌人,并使我的武器朝向改变。在我攻击时,我希望我的武器可以按照当时的角度增加或者减少角度。
答主 团结 MuseChat:
using UnityEngine;
public class WeaponController : MonoBehaviour
{
public Transform target; // 敌人的Transform
public float rotationSpeed = 5f; // 武器旋转速度
void Update()
{
if (target != null)
{
// 获取敌人方向
Vector3 targetDirection = target.position - transform.position;
targetDirection.y = 0f; // 确保武器在水平方向上旋转
// 旋转武器朝向敌人
Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
}
}
}
在这段代码中,我们首先获取敌人的方向,然后使用 Quaternion.LookRotation 来计算武器应该朝向的旋转角度,并通过 Quaternion.Slerp 来平滑地旋转武器朝向敌人。
接下来,您可以在角色控制器脚本中检测敌人并更新武器的目标。以下是一个简单的示例代码:
using UnityEngine;
public class CharacterController : MonoBehaviour
{
public WeaponController weaponController; // 武器控制器
void Update()
{
// 检测敌人,这里假设敌人是以Tag为"Enemy"的对象
GameObject enemy = GameObject.FindGameObjectWithTag("Enemy");
if (enemy != null)
{
// 更新武器的目标为敌人的Transform
weaponController.target = enemy.transform;
}
}
}
我想设置人物攻击,通过按键 j 来改变 trigger,可是 Unity 中识别不到。
using UnityEngine;
public class AttackController : MonoBehaviour
{
private Animator animator;
void Start()
{
animator = GetComponent<Animator>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.J))
{
// 触发攻击动作,这里假设使用Trigger来控制攻击动作
animator.SetTrigger("Attack");
}
}
}
将脚本附加到人物角色:将上述编写的脚本(例如 AttackController.cs)附加到您的人物角色对象上。
设置 Animator Controller:确保您的人物角色的 Animator Controller 中包含了名为 "Attack" 的Trigger 参数,并且有对应的攻击动画状态。
通过以上步骤,您可以在 Unity 中绑定按键 J 来触发人物的攻击动作。
在 Unity 打包 webgl 后,InputFiled 组件里无法输入中文,我在网上看到说用 InputMark_WebGL 这个插件,但我用了之后打包就会报错,想问问大佬们有遇到过吗
Unity 版本 2019.4.38;平台 webgl
https://github.com/kou-yeung/WebGLInput
Q4.使用 SceneManager.LoadScene 多场景切换,切换场景显示组件被销毁
答主 Mark:
创建一个 UI 控制器,专门控制 UI 的显示与隐藏。通过场景控制器则监听 SceneManager.sceneLoaded 判断场景加载状态并通知 UI 控制器显示对应的 UI。
我在每一个空都添加了 InputField,为什么输入的时候有些输入不进去,有些能输入进去。
答主 年少有你、Mark:
/// <summary>
/// 获得当前点击到的UI物体
/// </summary>
public void Skode_GetCurrentSelect()
{
// if (Input.GetMouseButtonDown(0))
// {
// GameObject obj = null;
//
// GraphicRaycaster[] graphicRaycasters = FindObjectsOfType<GraphicRaycaster>();
//
// PointerEventData eventData = new PointerEventData(EventSystem.current);
// eventData.pressPosition = Input.mousePosition;
// eventData.position = Input.mousePosition;
// List<RaycastResult> list = new List<RaycastResult>();
//
// foreach (var item in graphicRaycasters)
// {
// item.Raycast(eventData, list);
// if (list.Count > 0)
// {
// // for (int i = 0; i < list.Count; i++)
// // {
// // obj = list[i].gameObject;
// // }
// obj = list[0].gameObject;
// }
// }
//
// if (obj)
// {
// Debug.LogError(obj.name);
// }
// }
}
答主 君莫笑:
海岸(图中黑色) 三维的船(图中深蓝) 岛屿(图中棕色) 波动的海洋(图中浅蓝)
上面的图是二维的,而实际上的场景是三维的,类似下面这样
目前主要的问题是:
答主 ManHua:
using UnityEngine;
public class SceneToMatrix : MonoBehaviour
{
public int matrixWidth = 10; // 矩阵宽度
public int matrixHeight = 10; // 矩阵高度
private int[,] objectMatrix; // 二维数组,用于表示场景中对象所占据的位置
void Update()
{
// 初始化二维数组
objectMatrix = new int[matrixWidth, matrixHeight];
// 获取场景中的所有对象
GameObject[] objects = GameObject.FindGameObjectsWithTag("SceneObject");
foreach (GameObject obj in objects)
{
Vector3 position = obj.transform.position;
int x = Mathf.FloorToInt(position.x) + matrixWidth / 2;
int y = Mathf.FloorToInt(position.z) + matrixHeight / 2;
// 新增边界检查
if (x < 0 || x >= matrixWidth || y < 0 || y >= matrixHeight)
{
continue; // 跳过超出范围的物体
}
// 检查坐标是否超出矩阵范围
if (x >= 0 && x < matrixWidth && y >= 0 && y < matrixHeight)
{
// 根据对象的标识符设置矩阵中的值
if (obj.CompareTag("Coast"))
{
objectMatrix[x, y] = 0;
}
else if (obj.CompareTag("Ship"))
{
objectMatrix[x, y] = 1;
}
else if (obj.CompareTag("Island"))
{
objectMatrix[x, y] = 2;
}
else if (obj.CompareTag("Ocean"))
{
objectMatrix[x, y] = 3;
}
}
}
}
}
无法实现在屏幕二上的射线检测,在编辑模式或者只有一个屏幕可以进行射线检测,当导出 Exe 文件后,Input.mousePosition 无法在屏幕二上点击在镜头发出射线进行射线检测。
ca = GetComponent<Camera>();
Vector3 mousePoint = Input.mousePosition;
Ray ray = ca.ScreenPointToRay(mousePoint);
RaycastHit raycastHit;
if (Physics.Raycast(ray, out raycastHit,100, layerMask))
{}
自答:
已经解决了,导出后 PC 端后,多个屏幕的情况下需要处理鼠标在屏幕的位置,直接使用 RelativeMouseAt(查询相对鼠标坐标)函数转换即可,就可以导出后在屏幕二进行射线检测着
Vector3 mousePoint = Display.RelativeMouseAt(Input.mousePosition);
Ray ray = ca.ScreenPointToRay(mousePoint);
Unity 引擎
可能是版本 BUG 导致的,建议使用 LTS 版本试试是否还存在这种问题。