Unity 通过点击屏幕控制人物移动。

本文介绍了在Unity3D中如何通过点击屏幕控制角色移动。首先,将角色控制器的模型资源导入场景,然后引入官方的SmoothFollow脚本使摄像机跟随主角移动。由于官方脚本存在限制,当主角向后移动时无法看到面部,因此我们编写了自己的脚本以改进这一问题,并将其与主角对象关联起来。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


本文代码例子: http://vdisk.weibo.com/s/KLdrg

首先,直接将角色控制器包中的模型资源拖拽如层次视图当中。



           在Project视图中鼠标右键选择Import  Package ->Script引入官方提供的脚本,这些脚本主要是应用于摄像机朝向的部分。首先在Hierarchy视图中选择摄像机组件,接着在导航栏菜单中选择Compont -> Camera-Control ->SmoothFollow脚本。实际意义是将跟随脚本绑定在摄像机之上,目的是主角移动后摄像机也能跟随主角一并移动。如下图所示,脚本绑定完毕后可在右侧监测面板视图中看到Smooth Follow脚本。Target 就是射向摄像机朝向的参照物,这里把主角对象挂了上去意思是摄像机永远跟随主角移动。



### 实现 Unity 中基于 Raycast 的点击人物移动功能 为了实现在 Unity 中通过射线检测点击人物并让其执行特定动作(如移动),可以按照如下方法构建: #### 创建基础结构 首先定义一个用于控制目标对象行为的基础类 `CharacterController`,该类继承自 `MonoBehaviour`[^4]。 ```csharp using UnityEngine; public class ClickableCharacter : MonoBehaviour { private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } } ``` 此代码片段初始化了一个刚体组件 `Rigidbody` 来处理物理交互。这有助于后续应用力来改变物体的位置或速度。 #### 添加射线投射逻辑 接着,在场景中的摄像机上附加一个新的脚本来管理用户的输入以及相应的响应机制。这里假设使用的是主相机 (Main Camera),并且玩家可以通过鼠标左键触发事件。 ```csharp using UnityEngine; public class PlayerInputHandler : MonoBehaviour { public LayerMask targetLayer; // 定义可选层 void Update() { if(Input.GetMouseButtonDown(0)) { HandleClick(); } } void HandleClick() { RaycastHit hitInfo; if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hitInfo, Mathf.Infinity, targetLayer)) { Debug.Log($"Hit object name: {hitInfo.collider.name}"); var character = hitInfo.collider.GetComponent<ClickableCharacter>(); if(character != null) MoveCharacter(hitInfo.point); } } void MoveCharacter(Vector3 destination) { StartCoroutine(MoveRoutine(destination)); } IEnumerator MoveRoutine(Vector3 dest) { yield return new WaitForSeconds(.5f); // 延迟半秒 Vector3 direction = (dest - transform.position).normalized; float distanceThisFrame = Time.deltaTime * speed; while ((transform.position - dest).sqrMagnitude > Mathf.Epsilon) { transform.Translate(direction * distanceThisFrame, Space.World); yield return null; } } } ``` 上述代码实现了当用户单击屏幕上的某个位置时,程序会发射一条从摄像头出发经过光标的射线,并检查这条射线是否碰撞到了任何属于指定图层的对象。如果确实发生了碰撞,则尝试获取与之关联的 `ClickableCharacter` 组件实例;一旦找到匹配项,就调用相应的方法使角色向被点击地点平滑过渡[^1]。 请注意,对于更复杂的应用场景可能还需要考虑更多因素,比如优化性能、增加动画支持或是解决可能出现的角色控制器胶囊缩小问题等[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杜甲同学

感谢打赏,我会继续努力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值