Unity3D控制人物移动的多种方法

系列文章目录

unity知识点


文章目录

  • 系列文章目录
  • 前言
  • 一、人物移动之键盘移动
    • 1-1、代码如下
    • 1-2、效果
  • 二、人物移动之跟随鼠标点击移动
    • 2-1、代码如下
    • 2-2、效果
  • 三、人物移动之刚体移动
    • 3-1、代码如下
    • 3-2、效果
  • 四、人物移动之第一人称控制器移动
    • 4-1、代码如下
    • 4-2、效果
  • 五、Android触摸手势操作脚本(单指 双指 三指)
    • 5-1、代码如下
  • 总结


大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

前言

人物移动代码综合记录一下(因为有很多种).所以简单记录一下


在这里插入图片描述

一、人物移动之键盘移动

所谓键盘移动就是我们常玩游戏的操作 wasd来进行移动

1-1、代码如下

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

public class PlayerToKeyPad : MonoBehaviour
{
    public GameObject Player;
    public float m_speed = 5f;

    void Update()
    {
        //键盘控制移动 两种方法
        PlayerMove_KeyPad_1();
        PlayerMove_KeyPad_2();
    }

    //通过Transform组件 键盘控制移动
    public void PlayerMove_KeyPad_1()
    {
        if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.UpArrow)) //前
        {
            Player.transform.Translate(Vector3.forward * m_speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.S) | Input.GetKey(KeyCode.DownArrow)) //后
        {
            Player.transform.Translate(Vector3.forward * -m_speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.LeftArrow)) //左
        {
            Player.transform.Translate(Vector3.right * -m_speed * Time.deltaTime);
        }
        if (Input.GetKey(KeyCode.D) | Input.GetKey(KeyCode.RightArrow)) //右
        {
            Player.transform.Translate(Vector3.right * m_speed * Time.deltaTime);
        }
    }

    public void PlayerMove_KeyPad_2()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下

        Player.transform.Translate(Vector3.forward * vertical * m_speed * Time.deltaTime);//W S 上 下
        Player.transform.Translate(Vector3.right * horizontal * m_speed * Time.deltaTime);//A D 左右
    }
}

1-2、效果

人物移动之键盘控制效果

二、人物移动之跟随鼠标点击移动

2-1、代码如下

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

public class PlayerToMouse : MonoBehaviour
{
    public GameObject Player;
    Vector3 tempPoint = new Vector3(0, 0, 0);

    void Update()
    {
        PlayerMove_FollowMouse();
    }

    //角色移动到鼠标点击的位置
    public void PlayerMove_FollowMouse()
    {

        //右键点击
        if (Input.GetMouseButtonDown(1))
        {
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitInfo;
            if (Physics.Raycast(ray, out hitInfo))
            {
                tempPoint = new Vector3 ( hitInfo.point.x, hitInfo.point.y+0.5f, hitInfo.point.z);
            }
        }
        float step = 10 * Time.deltaTime;
        Player.transform.localPosition = Vector3.MoveTowards(Player.transform.localPosition, tempPoint, step);
        Player.transform.LookAt(tempPoint);
    }
}

2-2、效果

人物移动之跟随鼠标点击移动

三、人物移动之刚体移动

里面包含两个方法一个是:Velocity移动 一个是:AddForce移动

3-1、代码如下

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

public class PlayerToRigidbody : MonoBehaviour
{
    public GameObject Player;
    public float m_speed = 5f;
    void Update()
    {
        //PlayerMove_KeyRighidbody1();
        PlayerMove_KeyRighidbody2();
    }

    //通过Rigidbody组件 键盘控制移动 Velocity移动 角色身上需要挂载Rigidbody组件
    public void PlayerMove_KeyRighidbody1()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下
        //这个必须分开判断 因为一个物体的速度只有一个
        if (Input.GetKey(KeyCode.W) | Input.GetKey(KeyCode.S))
        {
            Player.GetComponent<Rigidbody>().velocity = Vector3.forward * vertical * m_speed;
        }
        if (Input.GetKey(KeyCode.A) | Input.GetKey(KeyCode.D))
        {
            Player.GetComponent<Rigidbody>().velocity = Vector3.right * horizontal * m_speed;
        }
    }
    //通过Rigidbody组件 键盘控制移动 AddForce移动 角色身上需要挂载Rigidbody组件
    public void PlayerMove_KeyRighidbody2()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下

        Player.GetComponent<Rigidbody>().AddForce(Vector3.forward * vertical * m_speed);
        Player.GetComponent<Rigidbody>().AddForce(Vector3.right * horizontal * m_speed);
    }

}

3-2、效果

人物移动之刚体移动

人物移动之刚体添加力移动

四、人物移动之第一人称控制器移动

里面包含两个方法一个是:SimpleMove控制移动 一个是:Move控制移动

4-1、代码如下

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

public class PlayerToCharacterController : MonoBehaviour
{
    public GameObject Player;
    public float m_speed = 5f;
    void Update()
    {
        //PlayerMove_KeyCharacterController1();
        PlayerMove_KeyCharacterController2();
    }

    //通过CharacterController组件 键盘移动物体 SimpleMove控制移动
    public void PlayerMove_KeyCharacterController1()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下
        if (horizontal !=0&&vertical ==0)
        {
            Player.GetComponent<CharacterController>().SimpleMove(transform.right * horizontal * m_speed);
        }
        else if (horizontal == 0 && vertical != 0)
        {
            Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);
        }
        else
        {
            //斜着走 例如w a一起按
            Player.GetComponent<CharacterController>().SimpleMove(transform.forward * vertical * m_speed);
            Player.GetComponent<CharacterController>().SimpleMove(transform.right * horizontal * m_speed);
        }
      
       
    }
    //通过CharacterController组件 键盘移动物体 Move控制移动
    public void PlayerMove_KeyCharacterController2()
    {
        float horizontal = Input.GetAxis("Horizontal"); //A D 左右
        float vertical = Input.GetAxis("Vertical"); //W S 上 下
        float moveY = 0;
        float m_gravity = 10f;
        moveY -= m_gravity * Time.deltaTime;//重力
        Player.GetComponent<CharacterController>().Move(new Vector3(horizontal, moveY, vertical) * m_speed * Time.deltaTime);
    }


}

4-2、效果

人物移动之第一人称控制器移动

五、Android触摸手势操作脚本(单指 双指 三指)

相机设置如下
在这里插入图片描述
单指移动,双指缩放 , 三指旋转
移动和旋转动的是Pivot 缩放动的是Main Camera的Z轴距离

5-1、代码如下

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

public class TouchMove : MonoBehaviour
{
    public Camera cameraMainTrans;
    public Transform rotTransform;
    private float zoomSpeed = 0.1f;
    private float rotateSpeed = 0.5f;
    private float moveSpeed = 0.1f;
    private Vector2 prevPos1, prevPos2,prevPos3;
    private float prevDistance;

    void Update()
    {
        // 处理单指触摸平移
        if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Moved)
        {
            Vector2 touchDeltaPosition = Input.GetTouch(0).deltaPosition;

            float tranY = touchDeltaPosition.y * (float)Math.Sin(Math.Round(this.transform.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);
            float tranZ = touchDeltaPosition.y * (float)Math.Cos(Math.Round(this.transform.localRotation.eulerAngles.x, 2) * Math.PI / 180.0);
            rotTransform.Translate(new Vector3(touchDeltaPosition.x, tranY, tranZ) * moveSpeed, Space.Self);
            Debug.Log(touchDeltaPosition.x + "单指横向+纵向+" + touchDeltaPosition.y);


        }

        // 处理双指触摸缩放
        if (Input.touchCount == 2)
        {
            Touch touch1 = Input.GetTouch(0);
            Touch touch2 = Input.GetTouch(1);

            // 获取距离和位置的差异
            Vector2 curPos1 = touch1.position;
            Vector2 curPos2 = touch2.position;
            float curDistance = Vector2.Distance(curPos1, curPos2);

            if (touch2.phase == TouchPhase.Began)
            {
                prevPos1 = curPos1;
                prevPos2 = curPos2;
                prevDistance = curDistance;
            }

            // 缩放摄像机
            float deltaDistance = curDistance - prevDistance;
            cameraMainTrans.transform.Translate(Vector3.back * -deltaDistance * 0.1f);

            // 更新变量
            prevPos1 = curPos1;
            prevPos2 = curPos2;
            prevDistance = curDistance;
        }

        // 处理三指触摸旋转
        if (Input.touchCount == 3)
        {
            Touch touch1 = Input.GetTouch(0);
            Touch touch2 = Input.GetTouch(1);
            Touch touch3 = Input.GetTouch(2);

            // 获取触摸位置的差异
            Vector2 curPos1 = touch1.position;
            Vector2 curPos2 = touch2.position;
            Vector2 curPos3 = touch3.position;
            Vector2 deltaPos1 = curPos1 - prevPos1;
            Vector2 deltaPos2 = curPos2 - prevPos2;
            Vector2 deltaPos3 = curPos3 - prevPos3;

            if (touch2.phase == TouchPhase.Moved)
            {
                // 计算横向旋转
                float horizontalRotation = deltaPos1.x * rotateSpeed;
                rotTransform.Rotate(Vector3.up, horizontalRotation);

                // 计算纵向旋转
                float verticalRotation = -deltaPos1.y * rotateSpeed;
                Vector3 verticalRotationAxis = rotTransform.TransformVector(Vector3.left);
                rotTransform.RotateAround(rotTransform.position, verticalRotationAxis, verticalRotation);
            }

            // 更新变量
            prevPos1 = curPos1;
            prevPos2 = curPos2;
            prevPos3 = curPos3;
        }
        else if (Input.touchCount == 0)
        {
            // 清除前一帧的触摸位置
            prevPos1 = Vector2.zero;
            prevPos2 = Vector2.zero;
            prevPos3 = Vector2.zero;
        }
    }
    
    private static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
}

总结

不定时更新Unity开发技巧,觉得有用记得一键三连哦。
防止后面忘记,所以记录一下

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java缓存介绍

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统&#xff0c;其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的&#xff0c;用于协调两者数据传输速度差异的结构&#xff0c;均可称之为 Cache 二、缓存的分类 1、基于…

全文干货!信息化和数字化的本质区别是什么?

信息化和数字化都是行业的发展方向&#xff0c;但有一些区别。 简单来说就是&#xff0c;信息化侧重系统建设&#xff0c;用以管理生成的信息与数据&#xff0c;通常包括建立OA办公系统、业务系统、财务管理系统、客户关系管理系统和人力管理系统等。数字化侧重于将物理业务和…

CC工具箱使用指南:【用地用海代码和名称转换】

一、简介 在国土空间规划中&#xff0c;用地用海的名称和代码是一一对应的&#xff0c;手动修改用地代码后&#xff0c;还需要相应的修改名称&#xff0c;纯纯的重复工作&#xff0c;因此做了这个工具。 工具可以实现用地编码转名称、名称转编码&#xff0c;并且同时支持新旧…

开源云真机平台-Sonic-H5页面自动化测试

开源云真机平台-Sonic-H5页面自动化测试 一、参考官方文档 切换WebView | Sonic - 开源云真机平台 1、WebView/H5调试 使用网页调试时的教学与注意事项。 #注意事项# v2.0.0-beta开始&#xff0c;使用网页调试时&#xff0c;需确保&#xff1a; 已经打开WebView页面被测…

leetcode—图 岛屿数量

岛屿数量 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网…

React16源码: React中的completeUnitOfWork的源码实现

completeUnitOfWork 1 &#xff09;概述 各种不同类型组件的一个更新过程对应的是在执行 performUnitOfWork 里面的 beginWork 阶段它是去向下遍历一棵 fiber 树的一侧的子节点&#xff0c;然后遍历到叶子节点为止&#xff0c;以及 return 自己 child 的这种方式在 performUni…

vConsole 与 Vue中未定义变量而引发的Maximum call stack size exceeded异常问题

一、问题描述 前段时间有个前端小伙伴反馈在打包发布正式环境后调用VantUI的<van-popup>组件显示时&#xff0c;显示空白&#xff0c;并且在控制台看到一个Maximum call stacksize exceeded&#xff08;超出最大调用堆栈大小&#xff09;,而本地开发环境正常&#xff1a…

Redis应用(1)缓存(1.2)------Redis三种缓存问题

三者出现的根本原因是&#xff1a;Redis缓存命中率下降&#xff0c;请求直接打到DB上了。 一、 缓存穿透&#xff1a; 1、定义&#xff1a; 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。…

编程语言MoonBit新增矩阵函数的语法糖

MoonBit更新 1. 新增矩阵函数的语法糖 新增矩阵函数的语法糖&#xff0c;用于方便地定义局部函数和具有模式匹配的匿名函数&#xff1a; fn init {fn boolean_or { // 带有模式匹配的局部函数true, _ > true_, true > true_, _ > false}fn apply(f, x) {f(x)}le…

第二篇【传奇开心果短博文系列】Python的OpenCV库技术点案例示例:图像处理

传奇开心果短博文系列 系列短博文目录Python的OpenCV库技术点案例示例短博文系列 博文目录一、项目目标二、第一个示例代码三、第二个示例代码四、第三个示例代码五、第四个示例代码六、第五个示例代码七、知识点归纳总结 系列短博文目录 Python的OpenCV库技术点案例示例短博文…

阿里云 SAE 2.0 正式商用:极简易用、百毫秒弹性效率,降本 40%

作者&#xff1a;黛忻 本文主要介绍阿里云 Serverless 应用引擎&#xff08;以下简称 SAE &#xff09;如何帮助企业跨越技术鸿沟&#xff0c;从传统应用架构无感升级到 Serverless 架构&#xff0c;以更高效、更经济的方式进行转型&#xff0c;快速进入云原生快车道&#xff0…

【android】 android 里写jni

目录 &#xff08;1&#xff09; 环境准备 (2) 关联c文件到gradle文件 &#xff08;3&#xff09; 生成了 (4) 书写 &#xff08;5&#xff09; 使用 &#xff08;6&#xff09;业务调用 参考文档 &#xff08;1&#xff09; 环境准备 ndk, cmake (2) 关联c文件到gr…

实战Arthas:常见命令与最佳实践

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 微信公众号&#xff1a;Java随想录 文章目录 前言常用命令类命令getstaticjadretransform 监测排查命令monitorstackthreadtracettwatch JVM命令heapdumpjfrmemorydashboardclassloaderloggerscmbeanprofile…

《移动通信原理与应用》实验一——QPSK调制与解调实验(实验箱)

目录 一、实验目的 二、实验主要内容及原理 2.1、主要内容 2.2、基本原理 三、实验器材 3.1、移动通信原理实验箱&#xff1a; 3.2、实验框图及电路说明 四、实验步骤 五、实验过程原始记录(数据、图表、计算等) 六、实验结果及分析 1、结果分析&#xff1a; 2、思…

docker compose安装milvus

下载对应版本的milvus-standalone-docker-compose.yml wget https://github.com/milvus-io/milvus/releases/download/v2.3.5/milvus-standalone-docker-compose.yml重新命令为docker-compose.yml mv milvus-standalone-docker-compose.yml docker-compose.yml启动milvus doc…

深入理解Linux中的动态库与静态库

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;I Wish My Mind Would Shut Up—Ivoris 0:21━━━━━━️&#x1f49f;──────── 2:04 &#x1f504; ◀️ …

Java基于沙箱环境实现支付宝支付

一、支付宝沙箱环境介绍 沙箱环境是支付宝开放平台为开发者提供的安全低门槛的测试环境&#xff0c;开发者在沙箱环境中调用接口无需具备所需的商业资质&#xff0c;无需绑定和开通产品&#xff0c;同时不会对生产环境中的数据造成任何影响。合理使用沙箱环境&#xff0c;可以…

【深度学习:集中偏差】减少计算机视觉数据集中偏差的 5 种方法

【深度学习&#xff1a;集中偏差】减少计算机视觉数据集中偏差的 5 种方法 有偏差的计算机视觉数据集会导致哪些问题&#xff1f;如何减少计算机视觉数据集中偏差的示例观察并监控带注释样本的类别分布确保数据集代表模型适用的人群明确定义对象分类、标记和注释的流程为标签质…

鸿蒙开发-UI-布局-列表

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 鸿蒙开发-UI-布局-层叠布局 鸿蒙开发-UI-布局-弹性布局 鸿蒙开发-UI-布局-相对布局 鸿蒙开发-UI-布局-格栅布局 文章目录 前言 一、基本概念 二、开发布局 1.布局约束 2.开发布局 三、应用特性 1.列表数据显示 2.列表数据迭代 3.列…

216. 组合总和 III - 力扣(LeetCode)

题目描述 找出所有相加之和为 n 的 k 个数的组合&#xff0c;且满足下列条件&#xff1a; 只使用数字1到9每个数字 最多使用一次 返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次&#xff0c;组合可以以任何顺序返回。 输入示例 k 3, n 7输出示例 [[1,2,…