2018-12-07 22:16:15 wang18236618195 阅读数 129

**

Unity3D 物体移动方法总结

**
1. 简介
在Unity3D中,有多种方式可以改变物体的坐标,实现移动的目的,其本质是每帧修改物体的position。

2. 通过Transform组件移动物体
Transform 组件用于描述物体在空间中的状态,它包括 位置(position), 旋转(rotation)和 缩放(scale)。 其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。

2.1 Transform.Translate
该方法可以将物体从当前位置,移动到指定位置,并且可以选择参照的坐标系。 当需要进行坐标系转换时,可以考虑使用该方法以省去转换坐标系的步骤

if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow)) //上移
{
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow)) //下移
{
transform.Translate(Vector3.down * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow)) //左移
{
transform.Translate(Vector3.left * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow)) //右移
{
transform.Translate(Vector3.right * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.E)) //前移
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
if (Input.GetKey(KeyCode.R)) //后移
{
transform.Translate(Vector3.back * speed * Time.deltaTime);
}

2.2 Vector3.Lerp, Vector3.Slerp, Vector3.MoveTowards
Vector3 既可以表示三维空间中的一个点,也可以表示一个向量。这三个方法均为插值方法, Lerp为线性插值,Slerp为球形插值, MoveTowards在Lerp的基础上增加了限制最大速度功能。 当需要从指定A点移动到B点时,可以考虑时候这些方法。

//A点到B点移动的两种方法:MoveTowards和Lerp
if (Input.GetKey(KeyCode.W))
{
transform.position = Vector3.MoveTowards(transform.position, target.position, stmp);
}

if (Input.GetKeyDown(KeyCode.D))
{
transform.position = Vector3.Lerp(transform.position, target.position, stmp);
}

///
/// 按钮点击移动,点到点的
///
void OnGUI()
{
if(GUI.Button(new Rect(0, 0, 100, 100), “移动”))
{
transform.position = Vector3.Lerp(transform.position, target.position, speed);
}

//Rect中四个量分别代表:屏幕x的位置,屏幕Y的位置,按钮高度,按钮长度
}

2.3 Vector3.SmoothDamp
该方法是可以平滑的从A逐渐移动到B点,并且可以控制速度,最常见的用法是相机跟随目标。

2.4 Transform.position
有时重新赋值position能更快实现我们的目标。

3. 通过Rigidbody组件移动物体
Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响,物体被碰撞后的击飞等等。

注意:关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

3.1 Rigidbody.velocity
设置刚体速度可以让物体运动并且忽略静摩擦力,这会让物体快速从静止状态进入运动状态。

3.2 Rigidbody.AddForce
给刚体添加一个方向的力,这种方式适合模拟物体在外力的作用下的运动状态。

3.3 Rigidbody.MovePosition
刚体受到物理约束的情况下,移动到指定点。

4. 通过CharacterController组件移动物体
CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

4.1 CharacterController.SimpleMove
用于模拟简单运动,并且自动应用重力,返回值表示角色当前是否着地。

4.2 CharacterController.Move
模拟更复杂的运动,重力需要通过代码实现,返回值表示角色与周围的碰撞信息。

2015-03-25 14:42:37 zhangzhaoyuxunlei 阅读数 563

 最近项目中需要用到物体渐变色,写了个demo留着

 

using UnityEngine;
public class test : MonoBehaviour
{
 public Color ColorBegin;
 public Color ColorEnd;
 
 public float Timer = 2.0f;
 
 private Color beginColor;
 private Color endColor;
 private float currentTimer;
 void OnEnable()
 {
  beginColor = ColorBegin;
  endColor = ColorEnd;
 }
 
 void Update()
 {
  currentTimer += Time.deltaTime;
  if (currentTimer >= Timer)
  {
   currentTimer = 0.0f;
   
   this.renderer.sharedMaterial.color = endColor;
   
   if (beginColor == ColorBegin)
   {
    beginColor = ColorEnd;
    endColor = ColorBegin;
   }
   else
   {
    beginColor = ColorBegin;
    endColor = ColorEnd;
   }
  }
  else
  {
   this.renderer.sharedMaterial.color = Color.Lerp(beginColor, endColor, currentTimer / Timer);
  }
 }
}

2019-12-22 14:30:57 zhunju0089 阅读数 196

效果图:

1.创建一个三维物体Cylinder圆柱体 Target

2.创建词汇表Yellow材质球

3.将材质球挂载到Target物体上

4.创建脚本MouseMove.cs

MouseMove.cs代码

using UnityEngine;
/*
 让物体完全跟随鼠标
     */
public class MouseMove : MonoBehaviour
{
    [Header("主相机")]
    [Tooltip("主相机")]
    /// <summary>
    /// 主相机
    /// </summary>
    public Camera m_mainCamera;
    [Header("目标物体")]
    [Tooltip("目标物体")]
    /// <summary>
    /// 目标物体
    /// </summary>
    public Transform m_target;

    void Start()
    {
        isDown = false;
        targetWTSP = m_mainCamera.WorldToScreenPoint(m_target.position);
    }
    /// <summary>
    /// 是否按下
    /// </summary>
    private bool isDown;
    /// <summary>
    /// 记录初始化时候target世界坐标转屏幕坐标时候的位置 WTSP==WorldToScreenPoint
    /// </summary>
    private Vector3 targetWTSP;
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            isDown = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            isDown = false;
        }
    }
    private void LateUpdate()
    {
        if (isDown)
        {
            Vector3 mouseVec3 = m_mainCamera.ScreenToWorldPoint(
                new Vector3(Input.mousePosition.x, Input.mousePosition.y, targetWTSP.z)
            );
            m_target.position = mouseVec3;
        }
    }
}

5.新建一个空物体Script,并将MouseMove.cs脚本挂载上去,再将相机和Target物体拖拽到脚本上

完毕!

 

 

 

 

2012-11-28 13:22:54 xggllc 阅读数 5178

    这几天在写一个数字漫游项目,有一个要求是在高空鸟瞰,沿着固定的路径移动.........

    部分代码如下:C#代码,CameraMove.cs

using UnityEngine;
using System.Collections;
public class CameraMove : MonoBehaviour 
{
     int SpeedUp = 10;
     bool Automatic = true;
     Vector3 Goal = new Vector3(200,10,100);
     void Update ()
    {
       if(Automatic)
		{
			Speed = true;
			transform.position=Vector3.MoveTowards(transform.position,Goal,Time.deltaTime * SpeedUp);
		}
    }
}

主要是 这个 Vector3.MoveTowards当前的地点移向目标。

API 上没有具体介绍,

说是 “这个函数基本上和Vector3.Lerp相同,而是该函数将确保我们的速度不会超过maxDistanceDelta。maxDistanceDelta的负值从目标推开向量,就是说maxDistanceDelta是正值,当前地点移向目标,如果是负值当前地点将远离目标。”

第一个参数是 开始位置,第二个参数是 目标位置; 第三个参数 我理解为控制 移动速度与方向的;

上面代码中 SpeedUp 是为了控制 移动的速度的.......

上面代码拖动到摄像机上 ,就可以实现摄像机移动了......

貌似通过这个还可以设置按固定曲线轨迹移动,个人觉得可以通过一些逻辑判断来实现(PS:目前没要求曲线我就没有做测试)。

嘿嘿........小弟新手 ,希望大家多多指教~

                                                                                                                                                                                                                                                         破破

                                                                                                                                                                                                                                           2012年11月28日 13:02:44
2017-10-10 10:33:04 qq_30087879 阅读数 2228

在update中检测

首先要在摄像机中添加组件Physics Raycaster

public void Update(){
if(Input.getMouseButtonUp(0)){
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit rayhit;
if(Physics.Raycast(ray,out rayhit)){
debug.log(rayhit.collider.gamaObject.name);

}
}


 

unity3D物体旋转

阅读数 124

unity3D中物体实现任意角度自旋转

博文 来自: yangyisen0713

Unity3D 物体移动方式总结

博文 来自: qq_44884706
没有更多推荐了,返回首页