OneBigLoser
OneBigLoser
发布于 2024-06-14 / 54 阅读
0
0

transform.forward/.right/.up 三种详细讲解

这三个方向属性 (transform.forward, transform.right, transform.up) 在游戏开发中有许多其他的用途,除了控制物体的移动和旋转之外,它们还可以用于各种计算和操作。以下是一些常见的用途和示例:

总结

  • transform.forward:用于确定物体的前进方向、发射方向、检测前方物体,朝向和对齐等。

  • transform.right:用于侧向移动、侧滑、侧向旋转、横向碰撞检测等。

  • transform.up:用于垂直移动、对齐表面、保持物体的上方向等。

这些属性不仅仅用于基本的移动和旋转控制,还可以应用于复杂的物理计算、动画调整、碰撞检测、视野检测等各种场景。在游戏开发中灵活运用这些方向属性,可以显著提升游戏的交互性和表现力。

1. 定位和对齐

确定物体朝向

可以使用这些方向属性来对齐物体,使其朝向特定的方向。例如,让一个角色始终面向摄像机。

using UnityEngine;

public class FaceCamera : MonoBehaviour
{
    void Update()
    {
        Vector3 direction = Camera.main.transform.position - transform.position;
        direction.y = 0; // 保持水平面上的对齐
        transform.forward = direction.normalized;
    }
}
    //或者控制物体移动时候来让突然随着移动宣传方向

private void Update()
    {
        float moveHorizontal = Input.GetAxis("Horizontal");
        float moveVertical = Input.GetAxis("Vertical");
        Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical);
        transform.position += movement * moveSpeed * Time.deltaTime;
        transform.forward = Vector3.Slerp(transform.forward, movement, 2 * moveSpeed * Time.deltaTime);
    }

2. 碰撞检测和射线投射

射线检测

使用transform.forward来确定射线的方向,从物体的前方向发射射线进行检测。

using UnityEngine;

public class RaycastForward : MonoBehaviour
{
    void Update()
    {
        RaycastHit hit;
        if (Physics.Raycast(transform.position, transform.forward, out hit, 10.0f))
        {
            Debug.Log("Hit: " + hit.collider.name);
        }
    }
}

3. 计算视野范围

检查是否在视野范围内

使用物体的方向来确定其他物体是否在视野范围内。例如,AI角色检测玩家是否在其视野范围内。

using UnityEngine;

public class VisionCone : MonoBehaviour
{
    public Transform player;
    public float viewAngle = 45.0f;
    public float viewDistance = 10.0f;

    void Update()
    {
        Vector3 directionToPlayer = player.position - transform.position;
        float angle = Vector3.Angle(transform.forward, directionToPlayer);

        if (angle < viewAngle / 2 && directionToPlayer.magnitude < viewDistance)
        {
            Debug.Log("Player in sight!");
        }
    }
}

4. 碰撞响应和反弹

碰撞后反弹

当物体与其他物体碰撞时,使用transform.righttransform.up来计算反弹方向。

using UnityEngine;

public class BounceOnCollision : MonoBehaviour
{
    public float bounceForce = 10.0f;

    void OnCollisionEnter(Collision collision)
    {
        Vector3 bounceDirection = Vector3.Reflect(transform.forward, collision.contacts[0].normal);
        GetComponent<Rigidbody>().AddForce(bounceDirection * bounceForce, ForceMode.Impulse);
    }
}

5. 轨迹运动和飞行

飞行器运动

在飞行器的运动中使用这些方向属性来控制飞行方向和倾斜。

using UnityEngine;

public class AirplaneController : MonoBehaviour
{
    public float speed = 10.0f;
    public float rotationSpeed = 50.0f;

    void Update()
    {
        // 控制飞行器的前进
        transform.position += transform.forward * speed * Time.deltaTime;

        // 控制飞行器的旋转
        float pitch = Input.GetAxis("Vertical") * rotationSpeed * Time.deltaTime;
        float yaw = Input.GetAxis("Horizontal") * rotationSpeed * Time.deltaTime;

        transform.Rotate(pitch, yaw, 0);
    }
}

6. 物体放置和生成

在表面上放置物体

使用transform.up来确保物体正确地对齐到表面。例如,将一个物体放置在地形表面上,并对齐其上方向。

using UnityEngine;

public class PlaceOnSurface : MonoBehaviour
{
    public Transform objectToPlace;
    public LayerMask surfaceLayer;

    void Update()
    {
        Ray ray = new Ray(transform.position, -transform.up);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, Mathf.Infinity, surfaceLayer))
        {
            objectToPlace.position = hit.point;
            objectToPlace.up = hit.normal;
        }
    }
}

7. 相对运动和旋转

相对旋转

使用transform.righttransform.up来实现相对旋转。例如,让一个角色绕其右方向或上方向旋转。

using UnityEngine;

public class RotateAroundAxis : MonoBehaviour
{
    public float rotationSpeed = 30.0f;

    void Update()
    {
        // 绕右方向旋转
        if (Input.GetKey(KeyCode.E))
        {
            transform.RotateAround(transform.position, transform.right, rotationSpeed * Time.deltaTime);
        }

        // 绕上方向旋转
        if (Input.GetKey(KeyCode.Q))
        {
            transform.RotateAround(transform.position, transform.up, rotationSpeed * Time.deltaTime);
        }
    }
}

8. 动画和效果

相机跟随

使用transform.forward来创建一个简单的相机跟随效果,使相机始终保持在角色后方。

using UnityEngine;

public class CameraFollow : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;

    void LateUpdate()
    {
        Vector3 desiredPosition = target.position + target.forward * offset.z + target.up * offset.y;
        transform.position = desiredPosition;
        transform.LookAt(target);
    }
}

9. 方向控制

瞄准方向

在射击游戏中,使用transform.forward来控制枪口的瞄准方向,使其指向目标。

using UnityEngine;

public class AimAtTarget : MonoBehaviour
{
    public Transform target;

    void Update()
    {
        Vector3 direction = (target.position - transform.position).normalized;
        transform.forward = direction;
    }
}

10. 动画和物理结合

骨骼动画调整

在复杂的角色动画中,使用这些方向属性来动态调整骨骼的方向。

using UnityEngine;

public class AdjustBoneDirection : MonoBehaviour
{
    public Transform bone;
    public Transform lookAtTarget;

    void Update()
    {
        Vector3 direction = (lookAtTarget.position - bone.position).normalized;
        bone.forward = direction;
    }
}


评论