Unity3D控制物体移动_unity移动代码_Gary_Leong的博客-程序员秘密

技术标签: C#  Unity3D  unity3d  

在游戏开发中,游戏物体的移动是最基本的,如果连物体都移动不起来,那就不用说玩游戏了。

下面记录了自己在开发中实现的物体移动,不同项目可能有不同的物体移动实现,也有很多种不同的物体移动实现,文章会持续更新。

1.rigidbody.MovePosition()控制物体上下左右移动(简单好用)

// Update is called once per frame
    void Update()
    {
        //控制移动
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        rigidbody.MovePosition(transform.position + new Vector3(h, 0, v) * speed * Time.deltaTime);
    }

2.transform.Translate();上下左右移动

using UnityEngine;
using System.Collections;

public class Move : MonoBehaviour
{
    public float speed = 5;
    private Transform transform;

    // Use this for initialization
    void Start()
    {
        transform = this.GetComponent<Transform>();
    }

    // Update is called once per frame
    void Update()
    {
        float h = Input.GetAxis("Horizontal");
        float v = Input.GetAxis("Vertical");

        transform.Translate(new Vector3(h, 0, v) * speed * Time.deltaTime);
    }
}

3.点击鼠标,物体移动到鼠标位置(2D,transform.position)

if (isMouseDown && GameManager._instance.gameState == GameState.Runing)
        {
            if (lastMousePosition != Vector3.zero)
            {
                //Camera.main.ScreenToWorldPoint(Input.mousePosition)
                Vector3 offest = Camera.main.ScreenToWorldPoint(Input.mousePosition) - lastMousePosition;//位移
                transform.position = transform.position + offest;
                checkPosition();
            }
            lastMousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
        }

4.rigidbody2D.AddForce();(2D游戏添加力左右移动物体,忍者跑酷)

void Update()
    {
        if (isSlide == false)
        {
            float h = Input.GetAxis("Horizontal");
            Vector2 velocity = rigidbody2D.velocity;


            if (h > 0.05f)
            {
                rigidbody2D.AddForce(Vector2.right * force_move);
            }
            else if (h < -0.05f)
            {
                rigidbody2D.AddForce(-Vector2.right * force_move);
            }
    }

5.点击鼠标,物体移动到鼠标的位置(3D,Vector3.MoveToWards()函数,BeatPlane飞机大战)

实现代码:

protected Transform _transform;
protected Vector3 targetPos;//目标位置

    // Use this for initialization
    void Start()
    {
        _transform = this.transform;
        targetPos = this._transform.position;
    }

    void MoveTo()
    {
        if (Input.GetMouseButton(0))
        {
            //获得鼠标屏幕位置
            Vector3 mousePos = Input.mousePosition;
            //将屏幕位置转为射线
            Ray ray = Camera.main.ScreenPointToRay(mousePos);
            //用来记录射线碰撞记录
            RaycastHit hitInfo;
            //产生射线
            bool isCast = Physics.Raycast(ray, out hitInfo, 1000, inputMask);
            if (isCast)
            {
                //如果射中目标,记录射线碰撞点 
                targetPos = hitInfo.point;
            }
        }
        //使用Vector3提供的MoveTowards函数,获得朝目标移动的位置
        Vector3 pos = Vector3.MoveTowards(this._transform.position, targetPos, speed * Time.deltaTime);
        //更新当前位置
        this._transform.position = pos;
    }

游戏运行时,点击鼠标,物体就会移动到鼠标所点击的位置。

6.键盘WSAD控制物体的上下左右移动(这个比较复杂。。)

void Control()
    {

        //获取鼠标移动距离
        float rh = Input.GetAxis("Mouse X");
        float rv = Input.GetAxis("Mouse Y");

        // 旋转摄像机
        m_camRot.x -= rv;
        m_camRot.y += rh;
        m_camTransform.eulerAngles = m_camRot;

        // 使主角的面向方向与摄像机一致
        Vector3 camrot = m_camTransform.eulerAngles;
        camrot.x = 0; camrot.z = 0;
        m_transform.eulerAngles = camrot;

        // 定义3个值控制移动
        float xm = 0, ym = 0, zm = 0;

        // 重力运动
        ym -= m_gravity * Time.deltaTime;

        //按键盘W向上移动
        if (Input.GetKey(KeyCode.W))
        {
            zm += m_movSpeed * Time.deltaTime;
        }
        else if (Input.GetKey(KeyCode.S))//按键盘S向下移动
        {
            zm -= m_movSpeed * Time.deltaTime;
        }

        if (Input.GetKey(KeyCode.A))//按键盘A向左移动
        {
            xm -= m_movSpeed * Time.deltaTime;
        }
        else if (Input.GetKey(KeyCode.D))//按键盘D向右移动
        {
            xm += m_movSpeed * Time.deltaTime;
        }<pre name="code" class="csharp">}



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

智能推荐

Java中覆盖与重载的区别_java覆盖与重载的区别_alex44667416的博客-程序员秘密

     override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:    1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到

UG/NX8.0 录制操作代码_Asia-Lee的博客-程序员秘密

1、选择录制语言打开ug-&gt;菜单栏(首选项)-&gt;用户界面-&gt;操作记录-&gt;(VB,C++,Java,C#)2、录制操作菜单项(工具)-&gt;操作记录-&gt;录制,然后进行操作3、完成录制操作后,工具-&gt;操作记录-&gt;停止录制或暂停录制...

基于云原生架构构建亿级多语言电商平台设计到落地实现第一阶段_youfanedu的博客-程序员秘密

技术的变革,一定是思想先行,云原生是一种构建和运行应用程序的方法,是一套技术体系和方法论。云原生(CloudNative)是一个组合词,Cloud+Native。Cloud表示应用程序位于云中,而不是传统的数据中心;Native表示应用程序从设计之初即考虑到云的环境,原生为云而设计,在云上以最佳姿势运行,充分利用和发挥云平台的弹性+分布式优势。云原生概括为4个要点:DevOps+持续交付+微服务+容器。符合云原生架构的应用程序应该是:采用开源堆栈(K8S+Docker)进行容器化,基于微服务架构提高灵

VMware 虚拟机与主机(本机)文件共享方法_anna19850927的博客-程序员秘密

首先说明一下笔者使用的系统版本,主机操作系统是 Windows 7,使用 VMware Workstation 7.0(界面已汉化),虚拟机安装 Windows XP Professional。只需简单的两步,即可实现虚拟机和主机文件共享。第一步,最好新建一个固定位置的共享文件夹,起一个容易记的名字,如“Share”、“共享”之类的。第二步,编辑虚拟机设置,打开虚拟机,找到如下图位置。(...

【Java基础 】Java7 NIO Files,Path 操作文件_andyjiang0310的博客-程序员秘密

从Java1.0到1.3,我们在开发需要I/O支持的应用时,要面临以下问题:没有数据缓冲区或通道的概念,开发人员要编程处理很多底层细节I/O操作会被阻塞,扩展能力有限所支持的字符集编码有限,需要进行很多手工编码工作来支持特定类型的硬件。不支持正则表达式,数据处理困难。为了解决这些问题,在Java1.4引入了NIO。其中有两次主要改进:在Java1.4中引入非阻塞I/O...

[转]WinForm中的DataGridView子窗体刷新父窗体备忘_aptl84294的博客-程序员秘密

转自:http://www.cnblogs.com/scy251147/archive/2011/02/27/1966413.html主要是前两天,有个同学问我这个方面的内容,当时利用了委托事件的方法来解决的,感觉效果还是挺好的。于是便记录了下来,以作备忘。本例中,主要实现的是向Access数据库中添加记录的功能。其中,主窗体负责显示数据,而弹出的子窗体负责添加数据,数据添加完毕...

随便推点

鸿蒙系统时钟问题怎么解决,鸿蒙系统时钟闪退_早鸟的博客-程序员秘密

电梯直达huafen325041339登堂入室发表于 2021-1-21 00:01:18来自:HUAWEI P40 Pro 5G最新回复 2021-1-21 20:15:48升级鸿蒙2.0系统,时钟闪退打不开,卸载重装也不行产品型号ELS-AN00出现频率总是问题类型卡顿/闪退/无响应类应用名称时钟应用版本11.0.0.503系统版本ELS-AN00 2.0.0.33(SP2DEVC00E2R3...

python os模块汇总_amelia1995的博客-程序员秘密

os模块 :操作系统的接口源码在Lib/os.pyos.name判断所在系统os.system() 运行shell命令'nt':windows;'posix':'Linux/Unix'.os.chdir(path)os.fchdir(fd)os.getcwdos.fsencode(filename)os.fsdecode(file...

iOS 自定义tabBar_ios mjtabbar_MJ_KeepingGo的博客-程序员秘密

苹果虽然帮我们封装好了菜单栏,但是有些时候我们不想用封装好的怎么办?自定义吧!!直接上代码了!!HFG_TabBar.h#import @interface HFG_TabBar : [email protected]_TabBar.m#import "HFG_TabBar.h"@interface HFG_TabBar (){ UIB

golang 爬虫简介-程序员秘密

golang goquery、colly基本使用

Android Studio中的Gradle依赖深入讲解_az44yao的博客-程序员秘密

Android Studio由于使用了gradle的进行项目构建,使我们开发app方便很多,下面这篇文章主要给大家介绍了关于Android Studio中Gradle依赖的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下前言Android studio依赖项目是使用gradle管理的,依赖一个项目、一个jar包、一个工程,都可以在这里进行配置,本文将给大家详细介绍关于Android Studio中Gradle依赖的相关内容,下面话不多说了,来一起看看详细的介绍吧一、不同类型的lib

推荐文章

热门文章

相关标签