Unity实现物件选中效果

首先制作两个显示效果,一个是未被选中时的物件(Visual),一个是被选中时的物件(Focused)。
然后将这两个gameObject挂载到父节点上。创建C#代码CounterFocused添加为父节点的组件。
public class CounterFocused : MonoBehaviour
{
    [SerializeField]
    private GameObject NormalVisual;
    [SerializeField]
    private GameObject FocusedVisual;
    private void Start()
    {
        Debug.Assert(NormalVisual!= null);
        Debug.Assert(FocusedVisual!= null);
        DeFocus();
    }
    public void Focus()
    {
        NormalVisual.SetActive(false);
        FocusedVisual.SetActive(true);
    }
    public void DeFocus()
    {
        NormalVisual.SetActive(true);
        FocusedVisual.SetActive(false);
    }
}

然后将两个子节点拖入两个变量中。
在Player脚本中每帧检测角色对面是否有可以选中的物件。
    private void Update()
    {
        HandleMovement();
        TryFocusObj();
    }
    private void TryFocusObj()
    {
        if(IsFocusedObjSameAsOldOne(out CounterFocused counterFocused))
            return;
        ResetCounterFocused();
        if(counterFocused!= null)
        {
            this._counterFocused = counterFocused;
            this._counterFocused.Focus();
        }
    }
    private bool IsFocusedObjSameAsOldOne(out CounterFocused counterFocusedOut)
    {
        if (!Physics.Raycast(transform.position, transform.forward, out RaycastHit raycastHit, 2f))
        {
            counterFocusedOut = null;
            return false;
        }
        if (!raycastHit.transform.TryGetComponent(out CounterFocused counterFocused))
        {
            counterFocusedOut = null;
            return false;
        }
        counterFocusedOut = counterFocused;
        if (_counterFocused == null)
            return false;
        if (!_counterFocused.Equals(counterFocused))
            return false;
        return true;
    }
    private void ResetCounterFocused()
    {
        if(_counterFocused != null) 
            this._counterFocused.DeFocus();
        this._counterFocused = null;
    }


 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号