Unity 移动方法总结

Unity移动方法总结

在Unity3D中,有多重方式可以改变物体的坐标,实现移动的目的,其本质是每帧改变物体的position。

  1. 通过Transform组件移动物体
    Transform组件用于描述物体在空间中的状态,它包括位置(position),旋转(rotation)和缩放(scale)。
    其实所有的移动都会导致position的改变,这里所说的通过Transform组件来移动物体,指的是直接操作Transform来控制物体的位置(position)。
    API:
//物体以relativeTo为参照系,根据translation的向量移动。如果relativeTo缺省将以Space.Self为默认值,还可以设置为Space.World和gameObject.transform。
function Translate (translation : Vector3, relativeTo : Space = Space.Self) : void
//相对坐标系空间:当relativeTo设置为空或者为Space.Self,表示该物体沿着自己本地坐标进行运动。当设置为Space.World,表示该物体沿着世界坐标系进行运动。
//相对其他物体坐标:当relativeTo设置为移动参考物体的gameObject.transform时,物体根据gameObject的坐标系进行相对运动。设置为Camera.main.transform时,相对主相机进行运动。

//两种形式
public void Translate(Vector3 translation, Space relativeTo = Space.Self); 
public void Translate(float x, float y, float z, Space relativeTo = Space.Self);

示例:

function Update() {
    //导弹相对于战斗机Fighter以Speed的速度向前运动,Vector3.forward在此时表示导弹的正前方
    transform.Translate(Vector3.forward * Speed * Time.deltaTime, Fighter.transform);
    }


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);
    }


//使用上下方向键或者W、S键来控制前后移动
float translation = Input.GetAxis("Vertical") * speed * Time.deltaTime;
//使用左右方向键或者A、D键来控制左右旋转
float rotation = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;
  1. 通过Rigidbody组件移动物体
    Rigidbody组件用于模拟物体的物理状态,比如物体受重力影响、物体被碰撞后的击飞和通过增加物体的受力以达到物理效果等等。
    注意,关于Rigidbody的调用均应放在FixedUpdate方法中,该方法会在每一次执行物理模拟前被调用。

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

void Start () {
    gameObject.GetComponent<Rigidbody>().velocity = Vector3.forward * MoveSpeed;
    }

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

//第一个例子
void Start(){
    rd = this.GetComponent<Rigidbody>();//给变量赋值刚体对象
    }
void FixedUpdate() {
    float h = Input.GetAxis("Horizontal"); //得到键盘左右控制
    float v = Input.GetAxis("Vertical"); //得到键盘上下控制
    rd.AddForce(new Vector3(h,0,v)*force);//对物体施加力 
    }

//另一个例子
void Update(){
    if(Input.GetMouseButton(0))
    {
        Ray ray =  Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;
        
        if(Physics.Raycast(ray, out hit))
        {
            if(hit.collider.name =="Cube")
            {
                Vector3 direction = hit.transform.position - obj.transform.position;
                //发射炮弹
                obj.GetComponent<Rigidbody>().AddForceAtPosition(direction, hit.transform.position,ForceMode.Impulse); //三个参数,分别为力、位置、力的方式
            }   
        }
    }
}

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

void FixedUpdate() {
    //让刚体rb向前运动Time.deltaTime距离
    rb.MovePosition(transform.position + transform.forward * Time.deltaTime);
        }
  1. 通过Vector3方法移动物体
    Vector3既可以表示三维空间中的一个点,也可以表示一个向量。
    Lerp为线性插值,Slerp为球形插值,MoveTowards在Lerp的基础上增加了限制最大速度功能。当需要从指定A点移动到B点时,可以考虑时候这些方法。

(1)Vector3.Lerp()
API:

static function Lerp(transform.position, target, MoveSpeed * Time.deltaTime) : Vector3;

示例:

void Start () {
    public float MoveSpeed = 0.1f;
    public Vector3 target = new Vector3(20, transform.position.y, 20);
        }
 
void Update () {
    gameObject.transform.localPosition = Vector3.Lerp(transform.position, Target, MoveSpeed * Time.deltaTime);
        }

(2)Vector3.MoveTowards()
MoveTowards增加了限制最大速度功能。
API:

static function MoveTowards(current: Vector3, target: Vector3, maxDistanceDelta: float) : Vector3;

示例:

void Start () {
    public float MoveSpeed = 0.1f;
    public Vector3 target = new Vector3(20, transform.position.y, 20);
        }
 
void Update () {
    gameobject.transform.position = Vector3.MoveTowards(transform.position, target, MoveSpeed * Time.deltaTime);
        }

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

//在smoothTime的时间间隔内以当前的移动速度currentVelocity,从current移动到target
//需要注意的是currentVelocity值一般在开始时指定为零向量,每次调用该方法时该方法会自动给currentVelocity赋值
static function SmoothDamp (current : Vector3, target : Vector3, ref currentVelocity : Vector3, smoothTime : float) : Vector3

示例:

void Start () {
    public Transform target;
    public float smoothTime = 0.3F;
    private Vector3 velocity = Vector3.zero;
        }
 
void Update () {
    //定义一个目标位置在目标变换的上方并且在后面
    Vector3 targetPosition = target.TransformPoint(new Vector3(0, 5, -10));

    //平滑地移动摄像机朝向目标位置
    gameobject.transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref velocity, smoothTime);
        }
  1. 使用CharacterController组件控制角色移动
    Unity使用CharacterController(角色控制器)来控制角色骨骼运动,包括移动、跳跃以及各种动作。CharacterController比较复杂。
    CharacterController用于控制第一人称或第三人称角色的运动,使用这种方式可以模拟人的一些行为,比如限制角色爬坡的最大斜度,步伐的高度等。

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

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

### 回答1: 移动动画脚本的写法取决于您是要在哪种平台上实现移动动画,比如Unity,iOS或Android。如果您要在Unity中实现移动动画,可以使用Unity的脚本功能来实现,可以使用C#或UnityScript语言编写脚本。 ### 回答2: 在Unity中编写移动动画脚本需要以下步骤: 1. 创建一个脚本文件,并将其添加到要移动的游戏对象上。可以使用C#或UnityScript编写脚本。 2. 在脚本中添加所需的变量,例如移动速度和目标位置。 3. 使用Update()函数来检测输入或触发条件。例如,可以使用Input.GetAxis()函数来检测玩家的输入,或者使用触发器来触发脚本。 4. 在Update()函数中,通过调用Translate()函数来移动游戏对象。Translate()函数可以传入一个Vector3参数,用于设置移动方向和速度。可以使用移动速度乘以Time.deltaTime来平滑移动。 5. 使用条件语句来判断是否达到目标位置。如果达到目标位置,则停止移动。 6. 在需要播放动画的游戏对象上添加Animator组件,并创建所需的移动动画片段。 7. 在脚本中使用Animator组件的Play()函数来播放移动动画。可以使用Animator.Play()函数传入动画片段的名称。 8. 如果需要在移动过程中多次播放相同的动画片段,则需要判断当前的动画状态是否结束。可以使用Animator.GetCurrentAnimatorStateInfo()函数来获取当前动画状态的信息,并判断是否处于动画结束状态。 9. 最后,在脚本中添加所需的方法,例如将脚本附加到游戏对象、处理输入等。 总结:通过编写脚本来控制游戏对象的移动,使用条件语句来判断是否达到目标位置,并在需要的位置播放动画。使用Unity提供的函数和组件来实现移动动画效果。 ### 回答3: Unity中的移动动画脚本可以通过编写脚本来实现。下面是一个简单的示例。 首先,你需要在Unity中创建一个空物体,将其命名为"Player"。然后,在脚本控制文件夹中创建一个新的C#脚本,命名为"PlayerMovement"。 打开"PlayerMovement"脚本,开始编写代码。首先,你需要引入Unity的命名空间: ``` using UnityEngine; ``` 然后,在脚本类之前声明一个public变量,用于控制移动速度: ``` public float moveSpeed = 5f; ``` 接下来,在Update函数中编写代码来实现移动。以下是一个基础的移动代码: ``` void Update() { // 获取玩家输入 float moveX = Input.GetAxis("Horizontal"); float moveZ = Input.GetAxis("Vertical"); // 计算移动向量 Vector3 movement = new Vector3(moveX, 0f, moveZ); // 根据移动速度进行移动 transform.position += movement * moveSpeed * Time.deltaTime; } ``` 这段代码首先获取玩家的输入,然后根据输入计算出一个移动向量。接下来,通过改变物体的位置来实现移动移动速度通过乘以移动向量和Time.deltaTime来控制。 最后,在Unity中将"PlayerMovement"脚本附加到"Player"物体上。这样,当游戏运行时,"Player"物体将根据玩家的输入进行移动。 当然,这只是一个简单的示例,你可以根据具体的需求来扩展和修改这个脚本。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值