C# 如何使用一个光线投射并命中多个游戏对象? 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 关于MouseOverevent的公共类:MonoBehavior { 公共游戏对象[]对象; 私有向量3[]原始向量; 私有void Start() { originalpos=newvector3[objects.Length]; for(int i=0;i

C# 如何使用一个光线投射并命中多个游戏对象? 使用系统集合; 使用System.Collections.Generic; 使用UnityEngine; 关于MouseOverevent的公共类:MonoBehavior { 公共游戏对象[]对象; 私有向量3[]原始向量; 私有void Start() { originalpos=newvector3[objects.Length]; for(int i=0;i,c#,unity3d,raycasting,gameobject,C#,Unity3d,Raycasting,Gameobject,当对象和原始对象都是单件时,脚本运行良好。 但现在我做了阵列,因为我有不止一个游戏对象 我有3个被标记的游戏对象:“测试”、“测试1”、“测试2” 我想对他们执行相同的动作,但每次击中一个物体 如果点击“测试”,只移动z-3上的“测试”,然后回到原来的位置。 如果点击“Test1”,则只移动z-3上的“Test1”,然后返回到其原始位置,与“Test2”相同 进行相同的动作,但仅针对打击对象 您可以使用,它返回您可以循环使用的内容 像这样: using System.Collections; u

当对象和原始对象都是单件时,脚本运行良好。 但现在我做了阵列,因为我有不止一个游戏对象

我有3个被标记的游戏对象:“测试”、“测试1”、“测试2” 我想对他们执行相同的动作,但每次击中一个物体

如果点击“测试”,只移动z-3上的“测试”,然后回到原来的位置。 如果点击“Test1”,则只移动z-3上的“Test1”,然后返回到其原始位置,与“Test2”相同

进行相同的动作,但仅针对打击对象

您可以使用,它返回您可以循环使用的内容

像这样:

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

public class OnMouseOverEvent : MonoBehaviour
{
    public GameObject[] objects;

    private Vector3[] originalpos;

    private void Start()
    {
        originalpos = new Vector3[objects.Length];
        for (int i = 0; i < objects.Length; i++)
        {
            originalpos[i] = objects[i].transform.position;
        }
    }

    private void Update()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        RaycastHit hit;

        if (Physics.Raycast(ray, out hit, 100))
        {
            if (hit.transform.tag == "Test")
            {
               // if (transform.position.z != originalpos.z - 3)
                 //   StartCoroutine(moveToX(transform, new Vector3(transform.position.x, transform.position.y, transform.position.z - 3), 0.1f));
            }
            else
            {
               // StartCoroutine(moveToX(transform, originalpos, 0.1f));
            }
        }
        else
        {
            // reset
           // StartCoroutine(moveToX(transform, originalpos, 0.1f));
        }
    }

    bool isMoving = false;
    IEnumerator moveToX(Transform fromPosition, Vector3 toPosition, float duration)
    {
        //Make sure there is only one instance of this function running
        if (isMoving)
        {
            yield break; ///exit if this is still running
        }
        isMoving = true;

        float counter = 0;

        //Get the current position of the object to be moved
        Vector3 startPos = fromPosition.position;

        while (counter < duration)
        {
            counter += Time.deltaTime;
            fromPosition.position = Vector3.Lerp(startPos, toPosition, counter / duration);
            yield return null;
        }

        isMoving = false;
    }
}
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

RaycastHit[] hits = Physics.RaycastAll(ray, 100f);

// For each object that the raycast hits.
foreach (RaycastHit hit in hits) {

    if (hit.collider.CompareTag("Test")) {
        // Do something.
    } else if (hit.collider.CompareTag("Test1")) {
        // Do something.
    } else if (hit.collider.CompareTag("Test2")) {
        // Do something.
    }
}