Unity 实现人物移动_unity人物移动脚本-程序员宅基地

技术标签: unity  

首先创建一个专门控制移动的脚本(角色,npc都能用),命名为Movement,但是不带Input Manager,Manager在角色/npc脚本写。

此脚本挂载物体必为刚体,故用[RequireComponent(typeof (Rigidbody))]确保物体有刚体组件。

在Awake里调用刚体组件

在FixedUpdate里运用MovePosition方法,该方法是将物体移动到指定位置,参数为物体当前位置+当前输入值(方向)×速度×时间

Ps:希望方向输入值范围不超过1,则新写一个方法,命名为SetMovementInput,运用ClampMagnitude方法使输入的三维变量input不超过1

源代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof (Rigidbody))]
public class Movement : MonoBehaviour
{
    private Rigidbody rig;

    public Vector3 CurrentInput;
    public float speed;

    private void Awake()
    {
        rig = GetComponent<Rigidbody>();
    }

    private void FixedUpdate()
    {
        rig.MovePosition(rig.position+CurrentInput*speed*Time .deltaTime);//移动到目标位置,但有障碍过不去
    }

    public void SetMovementInput(Vector3 input)
    {
       CurrentInput =  Vector3.ClampMagnitude(input, 1f);
    }
}

在角色控制脚本中,首先还是在Awake中调用Movement脚本,然后使用其中的SetMovementInput方法,传入一个三维变量值,x为Horizontal,y为0,z为Vertical。

源代码如下,没有直接在Update里写是为了以后方便维护。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Character : MonoBehaviour
{
    private Movement movement;

    private void Awake()
    {
        movement = GetComponent<Movement>();
    }

    private void Update()
    {
        UpdateMovementInput();
    }

    private void UpdateMovementInput()
    {
        movement.SetMovementInput(new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")));
    }
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_63136168/article/details/123698490

智能推荐

Unity动画️11. IK动画—手与木头的匹配_unity onanimatorik-程序员宅基地

文章浏览阅读1.5k次,点赞3次,收藏7次。IK动画—手与木头的匹配_unity onanimatorik

C++11标准模板(STL)- 算法 - 数值运算 (std::accumulate)-程序员宅基地

文章浏览阅读3.4k次。对一个范围内的元素求和。计算给定值 init 与给定范围 [first, last) 中元素的和。第一版本用 operator+ ,第二版本用二元函数 op 求和元素,均将 std::move 应用到其左侧运算数 (C++20 起)。_std::accumulate

SPark学习笔记:13 Spark Streaming 的Transform算子和Action算子_sparkstream action算子-程序员宅基地

文章浏览阅读1.1k次。和RDD类似,DStreams也有一些转换算子用于处输入流中的数据。DStream中有很多转换算子和RDD的转换算子一样,同时也提供了一些额外的算子。此文将总结DStreams的各种算子的使用。_sparkstream action算子

【每日一linux命令7】用户及用户组-程序员宅基地

文章浏览阅读40次。一、查询用户及用户组相关命令1、whoami查询当前登录的用户名2、groups查询当前登录用户名所在的用户组3、groups root查询root用户名所在的用户组二、怎么批量查看用户组1、/etc/group文件包含所有组所以执行命令:cat /etc/group ,就可以查询到所有用户组了2、/etc/group解说/etc/group 文件是用户..._请用一句命令列出服务器上的所有用户组。

软件测试集合点策略,LoadRunner 技巧之集合点设置-程序员宅基地

文章浏览阅读203次。Action(){web_url("wapmail.10086.cn","URL=http://wapmail.10086.cn/","Resource=0","RecContentType=text/html","Referer=","Snapshot=t19.inf","Mode=HTML",EXTRARES,"Url=http://wapmail.10086.cn:8000/img/p/lo..._mo集合点

Android代码混淆及反编译apk_android 如何查看混淆后的代码-程序员宅基地

文章浏览阅读1k次,点赞3次,收藏4次。序言:经常听开发提起代码混淆引起的BUG,混淆后在测试一下有没有问题,那问题来了什么是代码混淆,怎么确认代码混淆成功了,带着问题读下文吧~~一、代码混淆的原理代码混淆是将程序中的代码,等价转换为难以阅读理解的行为,提高攻击者阅读理解代码的难度,提高安全性,可以有效的提高应用被逆向破解的难度二、代码混淆的方法1.字符串加密:对应用程序中使用的字符串进行加密,防止获取关键词定位核心业务代码2.类名、方法名混淆:讲代码中类名,方法名,属性名替换成无意义的符号,增加代码逆向难度,这种方式也是在jav_android 如何查看混淆后的代码

随便推点

python变白_Python OpenCV纯白色背景-程序员宅基地

文章浏览阅读2.5k次。我有一个DIY家庭摄影棚来拍照。我希望他们在纯白色的背景(#FFFFFF)和最少的用户交互这是我的原始图片(没有任何处理,只是相机的原始图片)我用opencv和Tkinter for UI实现了简单的python程序1)使用对象(ROI)获取rect我决定用UI来选择ROI,也许以后我会编写代码来自动识别照片上的对象。在2)使用cv2.grabCut函数,我尝试从这个矩形中剪切背景cv2.grab..._python opencv画白色背景

VScode 历史版本_下载历史版本vscode-程序员宅基地

文章浏览阅读2w次,点赞8次,收藏19次。VScode 官方历史版本下载地址https://code.visualstudio.com/updatesVScode 在github上的release列表https://github.com/Microsoft/vscode/releases其实vscode的下载地址中的一串超级长的哈希码就是commit id。其下载地址就是就这样拼接来的。以下是我使用 js 拼接来的部分版本下载..._下载历史版本vscode

数据结构-程序员宅基地

文章浏览阅读41次。数据结构:如:typedefstruct_WNDCLASS{UINTstyle;WNDPROClpfnWndProc;intcbClsExtra;}WNDCLASS,*PWNDCLASS;这个数据结构用汇编来表示:WNDCLASSstructstyle..._wndclass未初始化

Open3D与numpy互转_python numpy open3d 转换-程序员宅基地

文章浏览阅读1.1w次,点赞12次,收藏40次。作为点云可视化利器,居然百度了一圈没有谁写关于open3D与numpy互转的介绍,看来这个毕竟还是小众。翻了一遍官方介绍,还算简单,这里介绍一下如何转换。NumPy to open3d.PointCloudnumpy转open3D需要借助Vector3dVector函数,这样可以直接赋值与open3d.PointCloud.points,具体操作如下,假设xyz是一个n*3numpy数组:import numpy as npimport open3D as o3d\pcd = o3d.geom_python numpy open3d 转换

SpringBoot集成Zookeeper_springboot与zookeeper集成demo-程序员宅基地

文章浏览阅读5w次,点赞12次,收藏109次。Zookeeper 伪集群安装部署操作Java操作Zookeeper实现分布式锁和队列文章目录分布式事物CAP理论CAP定理的应用BASE理论2PC提交3PC提交zookeeper集群的角色ZAB协议的核心思想ZAB协议两种模式ZAB协议消息广播流程图ZAB协议奔溃恢复SpringBoot集成Zookeeper实战分布式事物分布式事务是指事务的参与者,支持事务的服务器,资源服务器分别位于..._springboot与zookeeper集成demo

线程同步&线程池_线程池同步-程序员宅基地

文章浏览阅读760次。线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,临界区对象就是其中一种。在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程。但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入,由于CPU时间调度上的问..._线程池同步

推荐文章

热门文章

相关标签