Home Game Development raycasting – Unity AudioSource.PlayClipAtPoint – controlling attenuation

raycasting – Unity AudioSource.PlayClipAtPoint – controlling attenuation

0
raycasting – Unity AudioSource.PlayClipAtPoint – controlling attenuation

[ad_1]

New developer here, looking to do some raycasting and controlling audio positioning in 3D space based on the raycasts interactions with other objects.
I’ve got the raycast ‘casting’ and able to report back where it collides other objects and managed to get audio to play back at that raycast point using AudioSource.PlayClipAtPoint()

However, PlayClipAtPoint doesn’t allow me to change the audio 3d attenuation settings as a one shot audio object is generated and then removed immediately and I can’t find any parameters to control this new object apart from a volume 0-1 float value.

I came across this post by Aldonaletto:

function PlayClipAt(clip: AudioClip, pos: Vector3): AudioSource; {
   var tempGO = GameObject("TempAudio"); // create the temp object
   tempGO.transform.position = pos; // set its position
   var aSource = tempGO.AddComponent(AudioSource); // add an audio source
   aSource.clip = clip; // define the clip
   // set other aSource properties here, if desired
   aSource.Play(); // start the sound
   Destroy(tempGO, clip.length); // destroy object after clip duration
   return aSource; // return the AudioSource reference
 }

But can’t seem to get the local function to work in Unity as it complains about not using C# version 7 or above. If I upgrade the C# version in visual studio I get compiler errors on Unity’s side.

Little bit stuck, would appreciate some advice! Some code below, just not sure what to put into the result of the if statement to get this to work.

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

public class raycasting : MonoBehaviour
{
    public float raycastlength = 3;
    public AudioClip playthis;
    public float ER_Volume = 1F;

    // Use this for initialization
    void Start()
    {
        //Debug.Log("I'm a sphere, yo!");
    }

    // Update is called once per frame
    void Update()
    {
        RaycastHit hit;
        Ray forwardray = new Ray(transform.position, Vector3.forward);

        //draw the raycast in scene view
        Debug.DrawRay(transform.position, Vector3.forward * raycastlength, Color.white);

        if (Input.GetMouseButtonDown(0))
        {
            //Debug.Log("We pressed the fire button!");
            if (Physics.Raycast(forwardray, out hit, raycastlength))
            {
                if (hit.collider.tag == "evil")
                {
                    Debug.Log("Raycast Hit!");
                    Debug.Log("Distance to object:" + hit.distance);
                    //Debug.Log("Object hit point:" + hit.point);

                    //play a sound using playclipatpoint, but this doesn't allow us to change attenuation settings
                    AudioSource.PlayClipAtPoint(playthis, hit.point, ER_Volume);
                }
            }
        }
    }
}

[ad_2]