• 下面是我人物移动的代码: using System.Collections; using System.Collections.Generic; using UnityEngine; public class playerMove : MonoBehaviour { public Transform myTransform;  private Ray...
  • unity3d 人物移动

    2020-04-08 17:08:06
    人物移动方式,有两方式: 根据键盘输入来进行移动。主要是用的代码: void Move() { if (Input.GetKey(KeyCode.W)) { transform.Translate(Vector3.forward * Time.deltaTime); } else if (Inp...

    人物移动方式,有两方式:

    根据键盘输入来进行移动。主要是用的代码:

        void Move()
        {
            if (Input.GetKey(KeyCode.W))
            {
                transform.Translate(Vector3.forward * Time.deltaTime);
            }
            else if (Input.GetKey(KeyCode.A))
            {
                transform.Translate(Vector3.left * Time.deltaTime);
            }
            else if (Input.GetKey(KeyCode.S))
            {
                transform.Translate(-Vector3.forward * Time.deltaTime);
            }
            else if (Input.GetKey(KeyCode.D))
            {
                transform.Translate(Vector3.right * Time.deltaTime);
            }
        }
    

    该种方式与上述方式的不同在于使用Horizontal和Vertical,其具体设置在
    Edit->Settings->Input。
    GetAxisRaw 没有使用平滑效果

    float hor = Input.GetAxisRaw("Horizontal");
        float ver = Input.GetAxisRaw("Vertical");
        void Move(float hor, float ver)
        {
            
            if(hor > 0.0f)
            {
                transform.Translate(Vector3.right * Time.deltaTime);
            }else if(hor < 0.0f)
            {
                transform.Translate(Vector3.left * Time.deltaTime);
            } else if(ver > 0.0f)
            {
                transform.Translate(Vector3.forward * Time.deltaTime);
            }
            else if (ver < 0.0f)
            {
                transform.Translate(Vector3.back * Time.deltaTime);
            }
        }
    
    展开全文
  • Unity3D实现人物转向与移动脚本。通过设定四个方向值进行角度计算
  • 首先在场景中添加一个cube。 并对其添加一个character controller 组件。因为character controller组件中包含碰撞体,所以可以将原本的collider删除掉。 然后对其添加一个c# script 组件用于编写代码。...

    首先在场景中添加一个cube。

    并对其添加一个character controller 组件。因为character controller组件中包含碰撞体,所以可以将原本的collider删除掉。

    然后对其添加一个c# script 组件用于编写代码。

    其c#代码编写如下所示。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class player : MonoBehaviour {
        private CharacterController controller;
        public int speed = 10;
    	// Use this for initialization
    	void Start () {
            controller = this.GetComponent<CharacterController>();
    	}
    	
    	// Update is called once per frame
    	void Update () {
    
            controller.SimpleMove(new Vector3(Input.GetAxis("Horizontal") * speed, 0, Input.GetAxis("Vertical") * speed));
    	}
    }
    

    如果要实现相机的跟踪,则首先将工作窗口调整到合适的视角

    然后选中main camera。并通过Game Object菜单栏中的 align with view来讲相机的视角初始位置设置好。

    设置情况如下图所示。

    然后为了实现相机的实时跟随,则可以将main camera拖到cube下作为其子物体。这样一来,main camera就转移到了这个cube的坐标系之下。在每一帧刷新的时候都会根据cube的位置调整其相对坐标不变。

    设置情况如下图所示。

     

    展开全文
  • 人物移动,首先要考虑人物与地面的碰撞,碰撞发生的条件是,两者必须都为碰撞体,且至少有一方为刚体,为了方便,我们就给人物加上刚体属性和碰撞体。 1首先是碰撞体属性,人形使用胶囊碰撞体,调整参数使其与人物...

    人物的移动,首先要考虑人物与地面的碰撞,碰撞发生的条件是,两者必须都为碰撞体,且至少有一方为刚体,为了方便,我们就给人物加上刚体属性和碰撞体。
    1首先是碰撞体属性,人形使用胶囊碰撞体,调整参数使其与人物外形相近。
    在这里插入图片描述 2接下来为人物添加刚体属性
    在这里插入图片描述 1mass,表示质量,我们默认为1.
    2Drag表示阻力大小,我们设为infinity,无穷大,这样人物的移动就没有惯性,指令停止时,人物移动也会立刻停止。
    3angular drag表示角度阻力大小,同样设置为无穷大。
    4use gravity表示物体受到重力影响。
    5is kinematic表示是否收到动力学影响,若勾选,则不会收到力的影响,我们不选。
    6interpolate 是否插入,不需要
    7碰撞检测类型选择离散形。
    在这里插入图片描述接下来是限制条件的选择,锁定其在y轴的位置,可以避免人物模型被其他模型卡上去的bug,旋转锁定x和z轴,避免人物出现向前倾倒或者向左右倒的动作,我们只希望他能够绕着y轴旋转即可。
    基本环境搭建完成后,即可写一个脚本来控制移动了。
    在这里插入图片描述在这里插入图片描述
    将该脚本导入player模型,运行时任务即可根据按键移动,但是没有动画的切换,只是僵硬的移动,并且人物在移动时摄像机并没有跟踪主角的视线,下一篇记录怎样完成动画的切换。

    展开全文
  • Unity移动某个游戏对象有以下两种方式:·更改Transform组件的Position属性;·利用物理引擎(PhyX, Box2D)移动游戏对象。首先我们试着通过调整Transform组件的属性实现游戏对象的移动。在Unity的左手坐标系中,+...


    Unity中移动某个游戏对象有以下两种方式:

    ·更改Transform组件的Position属性;

    ·利用物理引擎(PhyX, Box2D)移动游戏对象。

    首先我们试着通过调整Transform组件的属性实现游戏对象的移动。在Unity的左手坐标系中,+Z方向是前进,-Z方向就是后退。

    Translate函数

    Translate函数用于处理游戏对象移动,函数原型如下                                                                                             

    void Translate(Vector3 direction, [Space relativeTo]);

    Vector3(x, y, z)是unity提供的用于保存三维坐标值和向量数据的结构体。当我们将向量单位乘以速度(movespeed),游戏对象就会按照movespeed变量指定的速度移动。(这里应该有图片.jpg)

    tr.Translate(移动方向 * 速度 * 前进/后退方向 * Time.deltaTime, 基准坐标系);

    Time.deltaTime表示前一帧到当前帧或非的时间,需要注意的是,Update函数内,使用Transform组件 是游戏对象移动的逻辑必须乘以deltaTime,是游戏对象的移动速度不受帧率的影响,而根据某个固定的速度移动。打个比方,如果没有乘以Time.deltaTime,游戏对象将每帧1个单位的速度移动;如果乘以Time.deltaTime,游戏对象将以每秒1各单位的速度前进。除此之外,Translate函数的第二个参数能决定游戏对象是以全局坐标还是局部坐标移动。

    可以看到,使用Translate函数,我们可以轻松地实现游戏对象的控制,但同时也发现,这样“直来直去”的移动方式并不能很好的匹配较为复杂的地形,所以需要重力和碰撞。



    Character Controller

    为此,我们可以添加Character Controller组件。Character Controller不会对施加给它的作用力做出反应,也不会作用于其他的刚体。如果想让Character Controller组件能够作用于其他的刚体对象,可以通过脚本[OnControllerColliderHit()函数]在与其相碰撞的对象上使用一个作用力。另外,如果想让Character Controller受物理效果影响,那最好用刚体来代替它。


    以下代码通过Character Controller组件实现了WSAD和空格键的人物移动控制。

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityStandardAssets.Utility;
    
    public class PlayerMove : MonoBehaviour
    {
        public GameObject anibody;
        public float speed = 6.0F;//移动速度
        public float jumpSpeed = 8.0F;//跳跃速度
        public float gravity = 20.0F;//重力加速度
        private Vector3 moveDirection = Vector3.zero;
        CharacterController controller;
        Quaternion ed;//四元数 方向
        public Transform camPivot;
        public Transform camDir;
        public Transform forwardstep;
        public Transform downstep;
        private Transform tr;
    
        private float h, v;
    
        private Vector3 currPos = Vector3.zero;
        private Quaternion currRot = Quaternion.identity;
    
        void Awake()
    {
        ed = new Quaternion(0, 0, 0, 0);
        tr = GetComponent<Transform>();
       
        currPos = tr.position;
        currRot = tr.rotation;
    }
    
        void Update()
    {
        if (controller.isGrounded)//判断人物是否在地面
        {
              moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));//获取操作方向
              moveDirection = transform.TransformDirection(moveDirection);
              moveDirection *= speed;
              if (Input.GetKeyDown(KeyCode.Space))//跳跃
                    moveDirection.y = jumpSpeed;
              moveDirection.y -= gravity * Time.deltaTime;
              controller.Move(moveDirection * Time.deltaTime);
         }
         else//跳跃状态
         {
                moveDirection = new Vector3(Input.GetAxis("Horizontal") * speed, moveDirection.y, Input.GetAxis("Vertical") * speed);
                moveDirection = transform.TransformDirection(moveDirection);
                moveDirection.y -= gravity * Time.deltaTime;
                controller.Move(moveDirection * Time.deltaTime);
          }
    }

    这时我们发现,游戏对象虽然可以移动,但其朝向始终不变而且没有动作,就像恐怖片里的场景(至少我觉得有点吓人....)。关于动作我们可以先甩锅美术,日后再说。但如果我希望角色在移动时,能始终面向前方,可以加上这样一段代码:

    if (Input.anyKey)
         {
                camDir = Camera.main.transform;//获取摄像机位置信息
                ed = camDir.rotation;//摄像机方向
                ed.x = 0;
                ed.z = 0;
                transform.rotation = Quaternion.Slerp(transform.rotation, ed, Time.deltaTime * 5.0f);//这里用上了插值是为了使人物转向自然过度
          }

    这样,游戏对象的简单控制就完成了。嗯,看起来不错~

    但使用Character Controller组件也会遇到一些小麻烦,比如说下坡的时候,isGrounded的判断可能会出错,这时我们可以用射线的方法检测人物脚底与地面的距离作为另一个判断条件,当然这个的实现就日后再说了。






    展开全文
  • 一个是通过W、A、S、D来移动人物(示例一),另个是按屏幕上的按钮来移动人物(示例二)。很简单,只改了几行代码。 下面是“Assets”文件夹里面的资源。 示例一: using System.Collections; using System....

    一个是通过W、A、S、D来移动人物(示例一),另个是按屏幕上的按钮来移动人物(示例二)。很简单,只改了几行代码。

    下面是“Assets”文件夹里面的资源。

     

    示例一:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class E3_07keyboard : MonoBehaviour
    {
        //动画数组
        private Object[] animUp;
        private Object[] animDown;
        private Object[] animLeft;
        private Object[] animRight;
        //地图贴图
        private Texture2D map;
        //当前人物动画
        private Object[] tex;
        //人物X坐标
        private int x;
        //人物Y坐标
        private int y;
        //帧序列
        private int nowFram;
        //动画帧的总数
        private int mFrameCount;
        //限制一秒多少帧
        private float fps = 5;
        //限制帧的时间 
        private float time = 0;
        void Start()
        {
            //得到帧动画中的所有图片资源
            animUp = Resources.LoadAll("up");
            animDown = Resources.LoadAll("down");
            animLeft = Resources.LoadAll("left");
            animRight = Resources.LoadAll("right");
            //得到地图资源
            map = (Texture2D)Resources.Load("map/map");
            //设置默认动画
            tex = animUp;
        }
    
        void OnGUI()
        {
            //绘制贴图
            GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), map, ScaleMode.StretchToFill, true, 0);
    
            //绘制帧动画
            DrawAnimation(tex, new Rect(x, y, 32, 48));
    
            //点击按钮移动人物
            if (Input.GetKey(KeyCode.W))
            {
                y -= 2;
                tex = animUp;
            }
            if (Input.GetKey(KeyCode.S))
            {
                y += 2;
                tex = animDown;
            }
            if (Input.GetKey(KeyCode.A))
            {
                x -= 2;
                tex = animLeft;
            }
            if (Input.GetKey(KeyCode.D))
            {
                x += 2;
                tex = animRight;
            }
        }
    
    
        void DrawAnimation(Object[] tex, Rect rect)
        {
            //绘制当前帧
            GUI.DrawTexture(rect, (Texture)tex[nowFram], ScaleMode.StretchToFill, true, 0);
            //计算限制帧时间
            time += Time.deltaTime;
            //超过限制帧则切换图片
            if (time >= 1.0 / fps)
            {
                //帧序列切换
                nowFram++;
                //限制帧清空
                time = 0;
                //超过帧动画总数从第0帧开始
                if (nowFram >= tex.Length)
                {
                    nowFram = 0;
                }
            }
        }
    }

     

    示例二

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class E3_07button : MonoBehaviour
    {
        //动画数组
        private Object[] animUp;
        private Object[] animDown;
        private Object[] animLeft;
        private Object[] animRight;
        //地图贴图
        private Texture2D map;
        //当前人物动画
        private Object[] tex;
        //人物X坐标
        private int x;
        //人物Y坐标
        private int y;
        //帧序列
        private int nowFram;
        //动画帧的总数
        private int mFrameCount;
        //限制一秒多少帧
        private float fps = 5;
        //限制帧的时间 
        private float time = 0;
        void Start()
        {
            //得到帧动画中的所有图片资源
            animUp = Resources.LoadAll("up");
            animDown = Resources.LoadAll("down");
            animLeft = Resources.LoadAll("left");
            animRight = Resources.LoadAll("right");
            //得到地图资源
            map = (Texture2D)Resources.Load("map/map");
            //设置默认动画
            tex = animUp;
        }
    
        void OnGUI()
        {
            //绘制贴图
            GUI.DrawTexture(new Rect(0, 0, Screen.width, Screen.height), map, ScaleMode.StretchToFill, true, 0);
    
            //绘制帧动画
            DrawAnimation(tex, new Rect(x, y, 32, 48));
    
            //点击按钮移动人物
            if (GUILayout.RepeatButton("向上"))
            {
                y -= 2;
                tex = animUp;
            }
            if (GUILayout.RepeatButton("向下"))
            {
                y += 2;
                tex = animDown;
            }
            if (GUILayout.RepeatButton("向左"))
            {
                x -= 2;
                tex = animLeft;
            }
            if (GUILayout.RepeatButton("向右"))
            {
                x += 2;
                tex = animRight;
            }
        }
    
    
        void DrawAnimation(Object[] tex, Rect rect)
        {
            //绘制当前帧
            GUI.DrawTexture(rect, (Texture)tex[nowFram], ScaleMode.StretchToFill, true, 0);
            //计算限制帧时间
            time += Time.deltaTime;
            //超过限制帧则切换图片
            if (time >= 1.0 / fps)
            {
                //帧序列切换
                nowFram++;
                //限制帧清空
                time = 0;
                //超过帧动画总数从第0帧开始
                if (nowFram >= tex.Length)
                {
                    nowFram = 0;
                }
            }
        }
    }

     

     

     

    展开全文
  • Unity3D 人物移动控制

    2017-12-03 18:29:09
    加刚体(RigidBody) 设置 y方向锁定位置 拖拽脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class RemController : MonoBehaviour { Vector3 movement;...
  • Unity3D虚拟现实之实现人物转向与移动
  • using UnityEngine; using System.Collections;public class PlayerControl : MonoBehaviour { [HideInInspector] //隐藏属性,让其不在面板上显示 public bool facingRight = true; //定义朝向 ...
  • using System.Collections;using System.Collections.Generic;using UnityEngine;[System .Serializable ]public class Anim//游戏控制动画{ public AnimationClip idle; public AnimationClip runForward;...
  • 写在前面:由于本人是初学unity,对其中的部分机制理解还不够深,这篇文章的主要目的是记录我的开发过程,同时向读者们征求更好的解决方法。   上一次的鼠标点击移动的文章出了一点bug所以并不完全,这篇文章会...
  • unity3d 人物跳跃控制

    2018-01-01 13:49:13
    要添加动画状态机public class PlayerController : MonoBehaviour { Vector3 movement; Rigidbody playerRigidbody; Animator animator; // player移动速度 public float speed = 6f; private float x;
  • Unity3D中控制人物移动的方法很多,可以使用transform.Translate方法,但为了不穿越其他物体,需要使用刚体rigidbody。还可以使用角色控制器,角色控制器是自带刚体Rigidbody和碰撞器Collider的,移动可以使用...
  • * 人物移动,摄像机跟随 * */ public class PersonMove : MonoBehaviour { //跟随的摄像机 public Camera currCamera; //人物目标坐标 private Vector3 targetPos; //人物与摄像机的距离
  • Unity3D游戏开发FBX模型载入与人物行走动画的播放
  • 现在要做得一个东西是,人物在相机视角范围内,相机不移动,当人物出了相机视角范围内,相机才跟随物体移动,这时由又能看到物体了。这样方便看到物体的运动轨迹,求教
  • AI角色按照一定的移动逻辑进行移动时,AI逻辑处理角色需要移动的位置,还需要移动逻辑实时处理角色的当前速度和角度。官方的示例中角色的移动是通过设置速度之后,依靠动画的位移来实现的,所以代码中只需要设置角色...
1 2 3 4 5 ... 20
收藏数 3,404
精华内容 1,361