Unity3D笔记十五 碰撞、移动

碰撞 

Collision. [kəˈliʒən] 碰撞;冲突;(意见,看法)的抵触;(政党等的)倾轧

 

选择一个需要添加碰撞器的游戏对象后

Component->Physics-

Unity一共为对象提供了6

种碰撞器,分别是Box Collider[kəˈlaidə](盒子碰撞器)、Sphere Collider[ˈkæpsju:l](球体碰撞器)、Capsule Collider

(胶囊碰撞器)、Mesh Collider(网格碰撞器)和Wheel Collider(车轮碰撞器)还有一个Terrain Collider

 

Collider[kəˈlaidə] 相撞;碰撞;冲突;抵触

 

物理材质

1Assets- Import Package-Physic Materials

标准资源包中提供了5种常用的物理材质:

  1、弹性材质(Bouncy)[ˈbaunsi] adj.快活的;精神的;有弹性的;自大的

  2、冰材质(Ice)

  3、金属材质(Metal)[ˈmetl] n.金属;金属元素;成色;金色

  4、橡胶材质(Rubber)[ˈrʌbə] adj.橡胶制成的

  5、木头材质(Wood)。

2、除了可以使用Unity标准资源包中的5款物理材质,也可以自行创建物理材质。创建新物理材质的方法如下,在Project视图中点击“Create”→“Physic Material”菜单项即可

 

复制代码
using UnityEngine;
using System.Collections;

public class _6_3 : MonoBehaviour
{
    /// <summary>
    /// 角色控制器对象
    /// </summary>
    private CharacterController controller = null;

    /// <summary>
    /// 角色移动的速度
    /// </summary>
    private float moveSpeed = 30.0f;

    /// <summary>
    ///角色旋转的速度
    /// </summary>
    private float rotateSpeed = 3.0f;


    ////碰撞的游戏对象
    private GameObject colliderObj = null;
    // Use this for initialization
    void Start()
    {
        //获取角色控制器对象
        controller = GetComponent<CharacterController>();
    }

    private void OnGUI()
    {
        //控制角色旋转
        if (GUILayout.RepeatButton("向左旋转"))
        {
            transform.Rotate(0, -rotateSpeed, 0);
        }
        if (GUILayout.RepeatButton("向右旋转"))
        {
            transform.Rotate(0, rotateSpeed, 0);
        }

        #region 移动
        //SimpleMove() 只适用于平面中的移动 2 Move()方法适用于所有方向的移动,所以它可以实现游戏对象任意角度的飞行与移动效果。
        //在开发中,尽量使用Move()方法来控制角色移动,因为它完全可以取代SimpleMove()方法,并且使用它移动角色更为灵活 
        #endregion
        //控制角色移动  ×必须添加了角色控制器才有效  选择游戏对象Component-Physics-Character Controller
        #region 移动
        if (GUILayout.RepeatButton("向前移动"))
        {
            controller.SimpleMove(Vector3.forward * moveSpeed);//其参数为角色移动的方向,只支持x轴与z轴方向的移动
        }
        if (GUILayout.RepeatButton("向后移动"))
        {
            controller.SimpleMove(Vector3.back * moveSpeed);
        }
        if (GUILayout.RepeatButton("向左移动"))
        {
            controller.SimpleMove(Vector3.left * moveSpeed);
        }
        if (GUILayout.RepeatButton("向右移动"))
        {
            controller.SimpleMove(Vector3.right * moveSpeed);
        }
        if (GUILayout.RepeatButton("Move向右移动-飞了"))
        {
            controller.Move(Vector3.right * moveSpeed);
        } 
        #endregion

        #region 飞行
        //可以使用transform.TransformDirection()方法得到当前主角移动时面朝的方向
        if (GUILayout.RepeatButton("起飞"))
        {
            transform.Translate(0, 1, 0);
        }
        if (GUILayout.RepeatButton("降落"))
        {
            transform.Translate(0, -1, 0);
        }
        #endregion

        if (controller.collisionFlags == CollisionFlags.Sides)
        {
            if (controller)
            {
                if (colliderObj != null)
                {
                    GUI.color = Color.yellow;
                    GUI.Label(new Rect(200, 100, 200, 100), "碰撞游戏的对象为:" + colliderObj.name);
                } 
            }
        }
    }

    #region 碰撞检测 
    //角色控制器可感应游戏对象之间的碰撞,检测它们碰撞时,需要调用父类方法OnControllerColliderHit()
    void OnControllerColliderHit(ControllerColliderHit hit)
    {
        //得到碰撞的游戏对象
        colliderObj = hit.gameObject;//使用hit.gameObject引用,即可获取角色控制器组件碰撞后的游戏对象
    } 
    #endregion

    // Update is called once per frame
    void Update()
    {

    }
}
复制代码

 

 

 

 

posted @   PEPE YU  阅读(1097)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示