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

news2024/12/23 11:48:55

系列文章目录

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开发技巧,觉得有用记得一键三连哦。
防止后面忘记,所以记录一下

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P9232 [蓝桥杯 2023 省 A] 更小的数

[蓝桥杯 2023 省 A] 更小的数 终于本弱一次通关了一道研究生组别的题了[普及/提高−] 一道较为简单的双指针题,但一定有更好的解法. 题目描述 小蓝有一个长度均为 n n n 且仅由数字字符 0 ∼ 9 0 \sim 9 0∼9 组成的字符串&#xff0c;下标从 0 0 0 到 n − 1 n-1 n−1&a…

three.js从入门到精通系列教程052 - 制作立方体添加重影特效

<html><head><meta charset"UTF-8"><title>three.js从入门到精通系列教程052 - 制作立方体添加重影特效</title><script src"ThreeJS/three.js"></script><script src"ThreeJS/jquery.js"><…

精品基于Uniapp+springboot智慧校园管理系统App课程选课成绩

《[含文档PPT源码等]精品基于Uniappspringboot智慧校园管理系统App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm …

动态规划—— 求最长不下降序列LIS【集训笔记】

题目描述 设有由n(1≤n≤200)个整数组成的数列&#xff0c;记为:b(1)、b(2)、……、b(n)&#xff0c;若存在i1<i2<i3<…<ie 且有b(i1)<b(i2)<…<b(ie)则称为长度为e的不下降序列。程序要求&#xff0c;当原数列出之后&#xff0c;求出最长的不下降序列。 …

第16章_网络编程拓展练习(TCP编程,UDP编程)

文章目录 第16章_网络编程拓展练习TCP编程1、学生与老师交互2、查询单词3、拓展&#xff1a;查询单词4、图片上传5、拓展&#xff1a;图片上传6、多个客户端上传文件7、群聊 UDP编程8、群发消息 第16章_网络编程拓展练习 TCP编程 1、学生与老师交互 案例&#xff1a;客户端模…

vue的模板语法-指令-事件绑定-条件渲染

VSCode代码片段生成 我们在前面练习Vue的过程中&#xff0c;有些代码片段是需要经常写的&#xff0c;我们再VSCode中我们可以生成一个代码片段&#xff0c;方便我们快速生成。 VSCode中的代码片段有固定的格式&#xff0c;所以我们一般会借助于一个在线工具来完成。 具体的步…

前端模板字符串的使用

目录 1.说明 2.示例 3.总结 1.说明 模板字符串是用反引号&#xff08;&#xff09;分隔的字面量&#xff0c;允许多行字符串&#xff0c;带有嵌入表达式的字符串插值和一种带标签的模板的特殊结构。 是增强版的字符串&#xff0c;在进行字符串拼接时&#xff0c;可以拼接固…

基本的 Socket 模型

什么是Socket Socket 的中文名叫作插口&#xff0c;咋一看还挺迷惑的。事实上&#xff0c;双方要进行网络通信前&#xff0c;各自得创建一个 Socket&#xff0c;这相当于客户端和服务器都开了一个“口子”&#xff0c;双方读取和发送数据的时候&#xff0c;都通过这个“口子”…

机器学习 | 深入理解并掌握核心概念

在如今数字化时代的浪潮下&#xff0c;机器学习已经成为人工智能领域的璀璨明星。它像一面魔镜&#xff0c;赋予计算机系统学习和改进的能力&#xff0c;让机器能够从海量数据中提取规律、预测未来&#xff0c;甚至做出智能决策。本 专栏 将带您踏上机器学习的奇妙之旅&#xf…

什么是 Web3.0

什么是Web3.0 对于 Web3.0 的解释网上有很多&#xff0c;目前来说 Web3.0 是一个趋势&#xff0c;尚未有明确的定义。我们今天讨论下几个核心的点&#xff0c;就能很好的理解 Web3.0 要解决哪些问题 谁创造数据&#xff0c;这里的数据可以是一篇博客&#xff0c;一段视频&…

如何在容器内部进行抓包

//先获取POD 的容器ID号 //去pod容器所在节点进行解析id为pid号 //通过pid号进入这个容器的网络命名空间 docker inspect --format {{.State.Pid}} 05f38d2a61e29b5a9d24fc7a3906991ab92ecd58ff7e0eb4e339a4cc6b2c4fc4 //访问容器内部&#xff0c;Node01节点

微信小程序之WXSS模板样式、页面配置(.json)和网络数据请求

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…

Flutter 自定义AppBar实现滚动渐变

1、使用ListView实现上下滚动。 2、使用Stack&#xff1a;允许将其子部件放在彼此的顶部&#xff0c;第一个子部件将放置在底部。所以AppBar&#xff0c;写在ListView下面。 3、MediaQuery.removePadding&#xff1a;当使用ListView的时候发现&#xff0c;顶部有块默认的Padd…

【 CSS 】定位

不要因为小小的失败而放弃大大的梦想&#xff0c;每一次坚持都是通向成功的一步。- 马克吐温 1. 定位 1.1 为何使用定位 我们先来看一个效果&#xff0c;同时思考一下用标准流或浮动能否实现类似的效果&#xff1f; 场景1: 某个元素可以自由的在一个盒子内移动位置&#xff0c…

企业如何高效营销?CBTC储能展助力企业市场拓展,黄金展位告急!

不论一家公司的规模有多大&#xff0c;展会都为之提供了一个很好的拓展业务的机会。参展是一种高效的营销方式。主要表现在哪些方面呢&#xff1f; 1、低成本接触合作客户。公司要接触到合格的客户&#xff0c;参加展会是最有效的方式。展会调查研究表明&#xff0c;通过销售电…

Effective C++——绝不在构造和析构构成中使用虚函数

父类的构造函数中调用的虚函数不是“虚”的 class father { public:virtual void log() {cout << "father building." << endl;}father(){log();} };class son : public father { public:virtual void log() {cout << "son building." &…

【面试突击】性能优化面试实战

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复…

【博士每天一篇论文-综述】Deep Echo State Network (DeepESN)_ A Brief Survey

阅读时间&#xff1a;2023-11-22 1 介绍 年份&#xff1a;2017 作者&#xff1a;C. Gallicchio 比萨大学计算机科学系终身教授助理教授&#xff0c;A. Micheli&#xff0c;比萨大学计算机科学系 期刊&#xff1a; ArXiv 引用量&#xff1a;68 这是两个大牛的论文&#xff0c;…

仓储管理系统——软件工程报告(需求分析)②

需求分析 一、系统概况 仓库管理系统是一种基于互联网对实际仓库的管理平台&#xff0c;旨在提供一个方便、快捷、安全的存取货物和查询商品信息平台。该系统通过在线用户登录查询&#xff0c;可以线上操作线下具体出/入库操作、查询仓库商品信息、提高仓库运作效率&#xff…

年货节电视盒子哪个好?内行分享权威网络电视盒子排行榜

淘宝、京东等已经开始了年货节促销&#xff0c;很多消费者买电视盒子会选择在此时入手&#xff0c;我近来收到了很多关于电视盒子哪个好的咨询&#xff0c;考虑到大家在选购时会参考排行榜&#xff0c;我这次要分享的是网络电视盒子排行榜&#xff0c;目前业内公认最好的电视盒…