2017-02-24 16 views
0

学校私は小さな戦艦ゲームを作りたいと思っています。 OnMouseEnterイベントでセルを移動したいが何も起こらず、イベントが呼び出されない。Unity Battleships - GameObjectの色を変更する

コードを3つのスクリプト、データ、コントローラ、ビューに分けました。

マイデータは、情報を保持します:

public class CellCommonData : MonoBehaviour // Datastore 
{ 
    public bool IsShipCell { get; set; } // is a ship there? 

    public bool WasActivated { get; set; } // cell already clicked 

    [SerializeField] 
    private Color defaultColor; // default Color -> light blue 

    public Color DefaultColor { get { return defaultColor; } } 

    [SerializeField] 
    private Color mouseOverColor; // hover Color -> dark blue 

    public Color MouseOverColor { get { return defaultColor; } } 

    [SerializeField] 
    private Color hitColor; // hit Color -> green 

    public Color HitColor { get { return defaultColor; } } 

    [SerializeField] 
    private Color noHitColor; // no Hit -> red 

    public Color NoHitColor { get { return defaultColor; } } 

    private void Start() 
    { 
     WasActivated = false; // the cell is not clicked on Start 
    } 
} 

私のコントローラは、プレイヤーのアクション処理します:

public class CellCommonController : MonoBehaviour 
{ 
    private CellCommonData cellData; 
    private CellCommonView cellView; 

    private void Start() 
    { 
     cellData = GetComponent<CellCommonData>(); 
     cellView = GetComponent<CellCommonView>(); 
    } 

    private void OnMouseDown() // Cell clicked 
    { 
     if (!cellData.WasActivated) // Cell was not clicked before 
     { 
      if (cellData.IsShipCell) // ship hit? 
      { 
       cellView.SetCellColor(cellData.HitColor); 
      } 
      else // No ship there 
      { 
       cellView.SetCellColor(cellData.NoHitColor); 
      } 
      cellData.WasActivated = true; // Cell got clicked 
     } 
    } 
} 

とビューは、セルの "見える" 扱い:

public class CellCommonView : MonoBehaviour 
{ 
    private CellCommonData cellData; 
    private Renderer cellRenderer; 

    private void Start() 
    { 
     cellData = GetComponent<CellCommonData>(); 
     cellRenderer = GetComponent<Renderer>(); 
     SetCellColor(cellData.DefaultColor); // colorize the cell with the default Color 
    } 

    public void SetCellColor(Color color) // Change the cells color 
    { 
     cellRenderer.material.SetColor("_Color", color); 
    } 

    private void OnMouseEnter() // cell got hovered 
    { 
     if (!cellData.WasActivated) // not clicked 
     { 
      SetCellColor(cellData.MouseOverColor); 
     } 
    } 

    private void OnMouseExit() // leave the cell 
    { 
     if (!cellData.WasActivated) // not clicked 
     { 
      SetCellColor(cellData.DefaultColor); 
     } 
    } 
} 

私の唯一の問題は、イベントOnMouseEnter()OnMouseExit()がne verが呼び出されました。しかし、私はそこに何が間違っている、取得しないでください。ここで

はそれの写真です:

SceneView

+0

あなたはあなたがそのメソッドを呼び出しているときに何かにマウスが乗っていない場合は、マウスの上にマウスを置いてください。 –

+1

Debug.LogをOnMouseEnter()とOnMouseExit()の両方に入れてから、と呼ばれる。 – Programmer

+1

モデルクラスをMonoBehaviourにする理由は何ですか?そして、あなたの問題は、このゲームオブジェクト上の3次元コライダーコンポーネントがない可能性が最も高いです。 –

答えて

1

エラーがCellCommonData.csであり、すべてのゲッターはこのように、代わりに彼らの適切なバッキングフィールドのdefaultColorを返す:

public class CellCommonData : MonoBehaviour // Datastore 
{ 
    public bool IsShipCell { get; set; } // is a ship there? 

    public bool WasActivated { get; set; } // cell already clicked 

    [SerializeField] 
    private Color defaultColor; // default Color -> light blue 

    public Color DefaultColor { get { return defaultColor; } } 

    [SerializeField] 
    private Color mouseOverColor; // hover Color -> dark blue 

    public Color MouseOverColor { get { return mouseOverColor; } } 

    [SerializeField] 
    private Color hitColor; // hit Color -> green 

    public Color HitColor { get { return hitColor; } } 

    [SerializeField] 
    private Color noHitColor; // no Hit -> red 

    public Color NoHitColor { get { return noHitColor; } } 

    private void Start() 
    { 
     WasActivated = false; // the cell is not clicked on Start 
    } 
} 
関連する問題