欢迎光临散文网 会员登陆 & 注册

Up自制Unity预制脚本handler.cs

2023-04-02 08:27 作者:拥抱大自然  | 我要投稿

using System.Collections;

using System.Collections.Generic;

using System.Security.Cryptography.X509Certificates;

using UnityEngine;


public class handler : MonoBehaviour

{    

    public string targetName="";

    //保存目标物体的名字。

    

    public Transform targetTransform=null;

    //保存目标物体的坐标系。


    public Transform myself; 

    //保存玩家自己作为参考。


    public Vector3 targetEuler=new Vector3(0,0,0);

    //保存被抓取物体的相对旋转位置。


    public Vector3 targetDistance = new Vector3(0, 0, 0);

    //保存被抓取物体相对抓把的位置。


    Vector3 lastAngle = new Vector3(0, 0, 0);

    


    // Start is called before the first frame update

    void Start()

    {

        myself = transform.parent.parent.transform;

        //用来指定玩家自己,当抓取物体时给物体旋转做参考。  

    }


    // Update is called once per frame

    void Update()

    {

        KeyCode grabberKey = KeyCode.Mouse0;


        if (Input.GetKeyDown(grabberKey) && targetTransform != null)

        {

            lastAngle = myself.eulerAngles;

            targetEuler = targetTransform.GetComponent<Transform>().eulerAngles - myself.eulerAngles;

            targetDistance = targetTransform.position - transform.position;            

            //抓取物件。

        }


        if (Input.GetKey(grabberKey) && targetTransform != null)

        {

            lastAngle = myself.eulerAngles - lastAngle;                

            targetDistance = Quaternion.Euler(lastAngle)*targetDistance;

            lastAngle = myself.eulerAngles;


            targetTransform.position = transform.position + targetDistance;

            //当按下左边的shift的时候,拾取物体。物体的坐标等于抓把的坐标。

            targetTransform.eulerAngles = myself.eulerAngles + targetEuler;

            //当按下左边的shift的时候,拾取物体的旋转角度与抓把的联动。     

        }


        if (Input.GetKeyDown(KeyCode.R))

        {

            targetEuler = new Vector3(0, 0, 0);

            targetDistance = new Vector3(0, 0, 0);

            //当按下定义键的时候被抓物体姿势摆正。

        }



        if (Input.GetKeyDown(KeyCode.F3) && targetTransform != null)

        {

            targetTransform.GetComponent<Rigidbody>().useGravity = true;

            //开启被抓物体重力。

        }


        if (Input.GetKeyDown(KeyCode.F4) && targetTransform != null)

        {

            targetTransform.GetComponent<Rigidbody>().useGravity = false;

            //关闭被抓物体重力。

        }


        if (Input.GetKeyDown(KeyCode.F1))

        {

            transform.GetComponent<MeshRenderer>().enabled = false;

            //显示抓把。

        }

        if (Input.GetKeyDown(KeyCode.F2))

        {

            transform.GetComponent<MeshRenderer>().enabled = true;

            //隐藏抓把。

        }


        if (Input.GetKey(KeyCode.X))

        {

            targetEuler=new Vector3(targetEuler.x+1, targetEuler.y, targetEuler.z);

        }

        //按下则被抓物体沿x轴旋转。


        if (Input.GetKey(KeyCode.Z))

        {

            targetEuler = new Vector3(targetEuler.x, targetEuler.y, targetEuler.z+1);

        }

        //按下则被抓物体沿z轴旋转。


        if (Input.GetKey(KeyCode.Y))

        {

            targetEuler = new Vector3(targetEuler.x, targetEuler.y+1, targetEuler.z);

        }

        //按下则被抓物体沿y轴旋转。

    }


    private void OnTriggerEnter(Collider other)

    {

        if ((other.GetComponent<grabbable>().grabable == true) & (targetName=="") )

        {

            transform.GetComponent<handler>().targetName = other.GetComponent<Transform>().name;

            targetTransform = other.GetComponent<Transform>();             

            //玩家正面前方设有一个小球,设置为trigger属性,会与任何具有可抓取组件(grabbable脚本)的物体交互。与该物体接触时会设置一些属性。

        }

    }


    private void OnTriggerExit(Collider other)

    {

        if (other.GetComponent<Transform>().name == targetName)

        {

            transform.GetComponent<handler>().targetName = "";

            targetTransform = null;

            targetEuler = new Vector3(0, 0, 0);

            //玩家正面三米处设有一个小立方体,设置为trigger属性,会与任何具有可抓取组件(grabbable脚本)的物体交互。退出该接触时会清空一些属性。

        }

    }


}


Up自制Unity预制脚本handler.cs的评论 (共 条)

分享到微博请遵守国家法律