物理关节

铰链关节

按照固定的轴进行旋转

unity3D 画出射线 unity创建射线_unity

弹簧关节

两物体之间加装弹簧

unity3D 画出射线 unity创建射线_动画_02

固定关节

两个物体相关联

unity3D 画出射线 unity创建射线_游戏引擎_03

射线检测

通过射线检测,我们可以实现用鼠标来移动物体,当我们用鼠标点击场景中的某一位置,摄像机就发出一条射线,并且通过射线碰撞检测可以获取位置,同时就可以实现物体的移动。创建需要根据射线位置来变化位置的物体,并且为此物体编写脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RayTest : MonoBehaviour
{
    
    void Start()
    {
        //创建射线方法一  从零点开始,向上的方向创建上射线
        //Ray ray = new Ray(Vector3.zero,Vector3.up);    
    }

    void Update()
    {
        //方式二从摄像机发射射线
        if (Input.GetMouseButtonDown(0)) {
            //按下鼠标后摄像机发射射线
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
            //声明一个碰撞信息类
            RaycastHit hit;
            //进行碰撞检测
            bool res = Physics.Raycast(ray,out hit);
            //如果发生碰撞的情况下,hit就有内容
            if (res == true) { 
                Debug.Log(hit.point);
                transform.position = hit.point;
            }
            //多检测    100:碰撞距离  1<<10:只检测第十图层的物体
            RaycastHit[] hits = Physics.RaycastAll(ray,100,1<<10);
        }   
    }
}

制作简易动画

旧版动画组件制作

首先我们要为产生动画的物体添加动画组件

unity3D 画出射线 unity创建射线_动画_04

在动画制作窗口创建动画
动画其实就是物体的位置,旋转,缩放等参数的变化

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Animation : MonoBehaviour
{
    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            GetComponent<Animation>().Play();
        }
    }
}

新版动画制作
首先和上面一样我们为需要实现动画的物体添加动画组件,但现在要添加的是Animator,然后创建动画,新版的动画制作不同于旧版的点主要是,新版使用动画控制器进行各个动画的控制,因此要先创建动画控制器,将动画控制器挂载到物体上,在创建各个动画,之后在打开物体的动画控制器

unity3D 画出射线 unity创建射线_动画_05


用代码控制动画的播放

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CubeConllTest : MonoBehaviour
{
    private Animator animator;
    void Start()
    {
        //获取动画组件
        animator= GetComponent<Animator>();
    }

   
    void Update()
    {
        if (Input.GetMouseButtonDown(0)) {
            animator.Play("left");
        }
    }
}

脚本控制动画的切换

在动画控制器中加入我们需要的动画,并且为切换的动画设置过渡,并且我们为过渡动画设置一个触发器Trigger,并且将触发器添加到要出发动画的Conditions中

unity3D 画出射线 unity创建射线_游戏引擎_06


unity3D 画出射线 unity创建射线_System_07


接下来为物体编写脚本,实现动画的脚本式切换

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PickUp : MonoBehaviour
{
   
    void Start()
    {
        
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.F)) {
            //触发pickup参数
            GetComponent<Animator>().SetTrigger("pickUp");
        }
    }
}

脚本实现人物动画切换以及人物移动

本例实现人物的站立和跑步两个动作,并且移动时人物播放跑步动画,静止的时候播放站立动画

首先我们将站立和跑步动画导入人物的动画器控制器中,为两个动画创建过渡,并且设置Bool类型变量run来判断是否为运动状态,并且将run的true,false两种情况分别设为两个动画过渡的Conditions

unity3D 画出射线 unity创建射线_System_08


接下来为人物编写脚本实现通过按下上下左右键来实现人物移动和动画转换

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UIElements;

public class peopleRun : MonoBehaviour
{
    private Animator animator;
    void Start()
    {
        animator = GetComponent<Animator>();
    }

    
    void Update()
    {
        //获取水平轴
        float horizontal = Input.GetAxis("Horizontal");
        //获取垂直轴
        float veritial = Input.GetAxis("Vertical");
        //创建方向向量
        Vector3 dir = new Vector3(horizontal,0,veritial);
        //当用户按下方向按键
        if (dir != Vector3.zero)
        {
            //更改人物朝向
            transform.rotation = Quaternion.LookRotation(dir);
            //播放移动动画
            animator.SetBool("run", true);
            //实现人物移动
            transform.Translate(Vector3.forward * 2 * Time.deltaTime);
        }
        else {
            //松开方向键恢复静止动画
            animator.SetBool("run",false);
        }
    }
}